Name | Type | is_array | initial_value |
abilityHash | hashtable | No | |
AIPaused | boolean | No | |
assignmentData | hashtable | No | |
assignmentDataParent | integer | No | |
assignmentDataPlayerInt | integer | No | |
BeetleKing_Grey | unit | No | |
BeetleKing_Grey_lowestDist | real | No | -1.00 |
BeetleKing_Grey_target | unit | No | |
BeetleKing_Violet | unit | No | |
BeetleKing_Violet_target | unit | No | |
BookDefenders | group | No | |
CameraFocusIndex_CurrentCamera | integer | No | |
CineCam | unit | No | |
CineEric | unit | No | |
CineHerodin | unit | No | |
CineKael | unit | No | |
CineLilith | unit | No | |
CinematicGroup | group | No | |
CinematicGroup01 | group | No | |
CinematicGroup02 | group | No | |
CinematicModeOn | boolean | No | |
CinematicTimer | timer | No | |
CinematicTransmissionTime | boolean | No | |
CinematicTransmissionTimer | timer | No | |
CineMyrax | unit | No | |
CineSaira | unit | No | |
CineUnit | unit | No | |
CineWell | unit | No | |
const_trainingQueueSize | integer | No | 5 |
CurrentMusicList | string | No | |
DarkRangerLilith | unit | No | |
DeathKnight | unit | No | |
DeathKnightGroup | group | No | |
Dhjeri | unit | No | |
dT_trackingData | hashtable | No | |
DwarfBridgeDefenders | group | No | |
Eclipsa | unit | No | |
Eric_Dest | location | No | |
Eric_Group | group | No | |
Eric_HomeDefense | group | No | |
Eric_ImproveParty | boolean | No | |
Eric_MainTown | rect | No | |
Eric_NeedUnits | boolean | No | |
Eric_Outposts | group | No | |
Eric_PartyHealthQuotient | real | No | |
Eric_PartyNumWanted | integer | No | 6 |
Eric_PartyReady | boolean | No | |
Eric_PartyRemainingHealth | real | No | |
Eric_PartyStartingHealth | real | No | |
Eric_PartyStartingNumbers | integer | No | |
Eric_Point01 | location | No | |
Eric_Point02 | location | No | |
Eric_ReturnHome | boolean | No | |
Eric_ScoutMode | boolean | No | true |
Eric_Timer01 | timer | No | |
Eric_Timer02 | timer | No | |
Eric_Timer03 | timer | No | |
Eric_Workers | group | No | |
ericFirstTH | unit | No | |
ericPlayerID | integer | No | 3 |
EricsForces_Wave_Level | integer | No | |
execTrainingFuncHash | hashtable | No | |
FoundDwarves | boolean | No | |
GatheredArcaniteFragments | integer | No | |
GoblinAlchemist | unit | No | |
GoblinAlchemist_Dest | location | No | |
GoblinAlchemist_Dir | integer | No | |
Golem | unit | No | UnitNull |
Halar | unit | No | |
Halar_AttackDest | location | No | |
HalarActive | boolean | No | |
HalarRestTimer | timer | No | |
Heroddan | unit | No | UnitNull |
Herodin | unit | No | |
Herodin_Dest | location | No | |
Herodin_Group | group | No | |
Herodin_HomeDefense | group | No | |
Herodin_ImproveParty | boolean | No | |
Herodin_MainTown | rect | No | |
Herodin_NeedUnits | boolean | No | |
Herodin_Outposts | group | No | |
Herodin_PartyHealthQuotient | real | No | |
Herodin_PartyNumWanted | integer | No | 6 |
Herodin_PartyReady | boolean | No | |
Herodin_PartyRemainingHealth | real | No | |
Herodin_PartyStartingHealth | real | No | |
Herodin_PartyStartingNumbers | integer | No | |
Herodin_Point01 | location | No | |
Herodin_Point02 | location | No | |
Herodin_ReturnHome | boolean | No | |
Herodin_ScoutMode | boolean | No | true |
Herodin_Timer01 | timer | No | |
Herodin_Timer02 | timer | No | |
Herodin_Timer03 | timer | No | |
Herodin_Workers | group | No | |
herodinFirstTH | unit | No | |
herodinPlayerID | integer | No | 3 |
HeroGroup | group | No | |
HxNumOfRiflemen | integer | No | |
Kael | unit | No | UnitNull |
Kael_Copy | unit | No | |
Kael_MainTown | rect | No | |
LastCreatedOrderHashT | hashtable | No | |
LastCreatedOrderID | integer | No | |
LastCreatedOrderParentPath | string | No | |
LastCreatedOrderPath | string | No | |
LastCreatedOrderPlayerID | integer | No | |
LastCreatedTownChildPath | integer | No | |
LastCreatedTownHash | hashtable | No | |
LastCreatedTownInt | integer | No | |
LastCreatedTownParentPath | integer | No | |
lastCreatedTownPlayerIndex | integer | Yes | |
LastCreatedVUnitHashT | hashtable | No | |
LastCreatedVUnitParentPath | string | No | |
LastCreatedVUnitPath | string | No | |
LastCreatedWarPartyInt | integer | No | |
LastSavedParameterHash | hashtable | No | |
lastSavedParameterLocString | string | No | |
LastSavedParameterNameS | string | No | |
LastSavedParameterParentS | string | No | |
lastUsedAddDataHashIndex | integer | No | |
lastUsedAddDataRootName | string | No | |
LilithAboms | integer | No | |
LilithArmy | group | No | |
LilithArmyLevel | integer | No | |
LilithAttackDest | location | No | |
LilithAttacking | integer | No | |
LilithAttackingKael | boolean | No | |
LilithBeetles | integer | No | 5 |
LilithCFs | integer | No | 1 |
LilithCOGs | integer | No | 2 |
LilithGhouls | integer | No | 4 |
LilithPetKnight | unit | No | |
LilithSpawnRegion | rect | No | |
LordEricPaladin | unit | No | |
MaleRanger | unit | No | |
MillionBeetles_dest | location | No | |
MillionBeetles_group | group | No | |
MillionBeetles_lowestDist | real | No | -1.00 |
MillionBeetles_wave | integer | No | 1 |
Name_Alucard | string | No | Alucard |
Name_AlucardInfernalForm | string | No | Infernal |
Name_Dhjeri | string | No | Dhjeri |
Name_Dragonblight | string | No | Dragonblight |
Name_Herodin | string | No | Herodin Mountainkiller |
Name_Kael | string | No | Kael |
Name_LilithDarkRanger | string | No | Lilith |
Name_LordEricPaladin | string | No | Lord Eric the Mighty |
Name_PitlordSauresh | string | No | Sauresh the Divider of Brothers |
Name_Saira | string | No | Saira |
Name_Scout1 | string | No | Elven Scout |
paramString_building | string | No | _building_ |
paramString_Units | string | No | Units_ |
PitlordKagreshCleaver | unit | No | |
PlayerAI | hashtable | Yes | |
PlayerConstructionWorkers | group | Yes | |
PlayerFightingWorkers | group | Yes | |
PlayerGoldWorkers | group | Yes | |
PlayerIdleWorkers | group | Yes | |
PlayerLumberWorkers | group | Yes | |
PrinceAlucard | unit | No | |
PrinceAlucardInfernal | unit | No | |
QuestArcaniteGolem | quest | No | |
QuestBookOfMagic | quest | No | |
QuestDwarves | quest | No | |
QuestFindPath | quest | No | |
QuestSpellbook | quest | No | |
QuitCinematic | boolean | No | |
Rangers | group | No | |
sAI_HashLocationData | hashtable | No | |
sAI_lastCreatedBaseID | integer | No | |
sAIClaimedGoldMines | group | Yes | |
Saira | unit | No | |
SairaEscorts | boolean | No | |
savedCam | camerasetup | No | |
SavedCameraPosition | integer | No | |
savedSairaMain | unit | No | |
Scout1 | unit | No | |
SkipTrigger | trigger | No | |
SpiderQueen | unit | No | |
SpiderQueen_Dest | location | No | |
SpiderQueen_EmergeTimer | timer | No | |
SpiderQueen_Enemies | boolean | No | |
SpiderQueen_HasHammer | boolean | No | |
SpiderQueen_Hidden | boolean | No | |
SpiderQueen_Impatience | timer | No | |
SpiderQueen_LaunchFX | effect | No | |
SpiderQueen_Rocks | integer | No | 4 |
SpiderQueen_RockTimer | timer | No | |
SpiderQueen_Spell | string | No | |
SpiderQueen_SpellFinished | boolean | No | |
SpiderQueen_SpiderSpawn | integer | No | 3 |
Spyro_AirAttackWaveGroup | group | No | |
Spyro_GroundAttackWaveGroup | group | No | |
Spyro_Wave_Level | integer | No | |
SpyroTarget_Air | location | No | |
SpyroTarget_Ground | location | No | |
str_attack | string | No | attack |
str_emerge | string | No | retreat |
str_ensnare | string | No | ensnare |
str_getHammer | string | No | gethammer |
str_laser | string | No | laser |
str_move | string | No | move |
str_musicAlucard | string | No | musicAlucard |
str_musicAlucardMega | string | No | musicAlucard |
str_musicMain | string | No | musicMain |
str_retreat | string | No | retreat |
str_returnStart | string | No | returnstart |
str_rockFall | string | No | rockfall |
str_spawnSpiders | string | No | spawnspiders |
str_throwHammer | string | No | throwhammer |
string_harvestGoldMineTarget | string | No | harvestGoldMineTarget |
SummonedDragonBlight | unit | No | |
TeleportationStoneActive | boolean | No | |
TeleportStoneSiteLimit | integer | No | 3 |
temp_real_global | real | No | |
temp_real_global_dividend | real | No | |
temp_real_global_mod | real | No | |
tempAvailableGoldMines | group | No | |
tempBoolean | boolean | No | |
tempDestructable | destructable | No | |
tempGroup | group | No | |
tempGroup_Copy | group | No | |
tempHash | hashtable | No | |
tempHashData | hashtable | No | |
tempHighestReal | real | No | |
tempInt | integer | No | |
tempInt_Copy | integer | No | |
tempLocation | location | No | |
tempLocation_Copy | location | No | |
tempOrder | ordercode | No | |
tempParentString | string | No | |
tempPlayerInt | integer | No | |
tempReal | real | No | |
tempReal_Copy | real | No | |
tempRegion | rect | No | |
tempRootName | string | No | |
tempString | string | No | |
tempString_Copy | string | No | |
tempUnit | unit | No | |
tempUnit_Copy | unit | No | |
tempUnitType | unitcode | No | |
Terms | hashtable | Yes | |
townIndex | integer | No | |
TrainingQueues | hashtable | Yes | |
TransmissionFinished | boolean | No | |
TransmissionTimerStarted | boolean | No | |
UndeadBlue_Army | group | No | |
UndeadBlue_Workers | group | No | |
undeadBlueFirstTH | unit | No | |
undeadBluePlayerID | integer | No | 3 |
UndeadGeneratorTimer | timer | No | |
UndeadGrey_Army | group | No | |
UndeadGrey_Workers | group | No | |
undeadGreyFirstTH | unit | No | |
undeadGreyPlayerID | integer | No | 3 |
undeadSnowFirstTH | unit | No | |
UndeadViolet_Army | group | No | |
UndeadViolet_Workers | group | No | |
undeadVioletFirstTH | unit | No | |
undeadVioletPlayerID | integer | No | 3 |
UndeadWaveTimer | timer | No | |
UnitAI | hashtable | No | |
Yeorn | unit | No |
function cinematic_checkSkip takes nothing returns nothing
call StartTimerBJ(udg_CinematicTransmissionTimer, false, GetLastTransmissionDurationBJ())
loop
exitwhen (TimerGetRemaining(udg_CinematicTransmissionTimer) <= 0 )
if (udg_QuitCinematic == true) then
return
endif
call TriggerSleepAction(0.125)
endloop
return
endfunction
function cinematic_checkWaitSkip takes real r returns nothing
call StartTimerBJ(udg_CinematicTransmissionTimer, false, r)
loop
exitwhen (TimerGetRemaining(udg_CinematicTransmissionTimer) <= 0 )
if (udg_QuitCinematic == true) then
return
endif
call TriggerSleepAction(0.125)
endloop
return
endfunction
function cs_CameraFocus takes real p_startingfocaltarget, real p_startingfocusspread, real p_focaltarget, real p_focusspread, real p_time returns nothing
local integer i = 1
local real focaldiff = p_focaltarget - p_startingfocaltarget
local real DOPscalediff = p_focusspread - p_startingfocusspread
local real focalincrement = 0
local real DOPincrement = 0
local real currentFocalDist = 0
local real currentDOPScale = 0
local real increments = 0
local real lv_fps = 8.00
local real lv_waittime = 0
set increments = focaldiff / p_time * lv_fps
set lv_waittime = 1 / focaldiff / p_time
// 1 second divided into the amount of frames every second. It should be 1/8, I think.
set focalincrement = focaldiff / increments
set DOPincrement = DOPscalediff / increments
call CameraSetFocalDistance( p_startingfocaltarget )
call CameraSetDepthOfFieldScale( p_startingfocusspread )
loop
exitwhen i >= increments
set currentFocalDist = currentFocalDist + focalincrement
set currentDOPScale = currentDOPScale + DOPincrement
call CameraSetFocalDistance( currentFocalDist )
call CameraSetDepthOfFieldScale( currentDOPScale )
call PolledWait( 1/lv_fps )
//this is probably dicey, it could be inaccurate at certain levels, so make sure it's simple (in fact, just change it to timer, sir)
set i = i + 1
endloop
set i = 0
set focaldiff = 0
set DOPscalediff = 0
set focalincrement = 0
set DOPincrement = 0
set currentFocalDist = 0
set currentDOPScale = 0
set increments = 0
set lv_fps = 0
set lv_waittime = 0
endfunction
function cs_CameraFocus takes real p_startingfocaltarget, real p_startingfocusspread, real p_focaltarget, real p_focusspread, real p_time returns nothing
local integer i = 1
local real focaldiff = p_focaltarget - p_startingfocaltarget
local real DOPscalediff = p_focusspread - p_startingfocusspread
local real focalincrement = 0
local real DOPincrement = 0
local real currentFocalDist = 0
local real currentDOPScale = 0
local real increments = 0
local real lv_fps = 8.00
local real lv_waittime = 0
set increments = focaldiff / p_time * lv_fps
set lv_waittime = 1 / focaldiff / p_time
// 1 second divided into the amount of frames every second. It should be 1/8, I think.
set focalincrement = focaldiff / increments
set DOPincrement = DOPscalediff / increments
call CameraSetFocalDistance( p_startingfocaltarget )
call CameraSetDepthOfFieldScale( p_startingfocusspread )
loop
exitwhen i >= increments
set currentFocalDist = currentFocalDist + focalincrement
set currentDOPScale = currentDOPScale + DOPincrement
call CameraSetFocalDistance( currentFocalDist )
call CameraSetDepthOfFieldScale( currentDOPScale )
call PolledWait( 1/lv_fps )
//this is probably dicey, it could be inaccurate at certain levels, so make sure it's simple
set i = i + 1
endloop
set i = 0
set focaldiff = 0
set DOPscalediff = 0
set focalincrement = 0
set DOPincrement = 0
set currentFocalDist = 0
set currentDOPScale = 0
set increments = 0
set lv_fps = 0
set lv_waittime = 0
endfunction
function sAI_sairaMBStunExpire takes nothing returns nothing
local timer t = GetExpiredTimer()
local unit u = LoadUnitHandleBJ(0, StringHashBJ(I2S(GetHandleId(t)) + "_unit"), udg_tempHash )
//MAIN PART
if (udg_CinematicModeOn == false) then
call PauseUnitBJ( false, u)
endif
call FlushChildHashtableBJ( StringHashBJ(I2S(GetHandleId(t)) + "_unit"), udg_tempHash )
call DestroyTimer(t)
//PLUG LEAKS
set t = null
set u = null
endfunction
function sAI_animationReset takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer tID = GetHandleId(t)
local unit u = LoadUnitHandleBJ(0, StringHashBJ(I2S(tID) + "_unit"), udg_tempHash)
// MAIN PART
call ResetUnitAnimation( u )
call FlushChildHashtableBJ( StringHashBJ(I2S(tID) + "_unit"), udg_tempHash )
//PLUG LEAKS
call DestroyTimer(t)
set t = null
set tID = 0
set u = null
endfunction
constant native GetUnitX takes unit whichUnit returns real
constant native GetUnitY takes unit whichUnit returns real
//native BlzFourCC2S takes integer value returns string
//native BlzS2FourCC takes string value returns integer
native IssueTargetOrder takes unit whichUnit, string order, widget targetWidget returns boolean
native GetUnitCurrentOrder takes unit whichUnit returns integer
native GetResourceAmount takes unit whichUnit returns integer
native IssueInstantPointOrder takes unit whichUnit, string order, real x, real y, widget instantTargetWidget returns boolean
native IssueInstantPointOrderById takes unit whichUnit, integer order, real x, real y, widget instantTargetWidget returns boolean
native IssueInstantTargetOrder takes unit whichUnit, string order, widget targetWidget, widget instantTargetWidget returns boolean
native IssueInstantTargetOrderById takes unit whichUnit, integer order, widget targetWidget, widget instantTargetWidget returns boolean
native TimerStart takes timer whichTimer, real timeout, boolean periodic, code handlerFunc returns nothing
native IssueImmediateOrder takes unit whichUnit, string order returns boolean
native IssueImmediateOrderById takes unit whichUnit, integer order returns boolean
native IssuePointOrder takes unit whichUnit, string order, real x, real y returns boolean
native IssuePointOrderLoc takes unit whichUnit, string order, location whichLocation returns boolean
native IssuePointOrderById takes unit whichUnit, integer order, real x, real y returns boolean
native IssuePointOrderByIdLoc takes unit whichUnit, integer order, location whichLocation returns boolean
native IssueTargetOrder takes unit whichUnit, string order, widget targetWidget returns boolean
native IssueTargetOrderById takes unit whichUnit, integer order, widget targetWidget returns boolean
native IssueInstantPointOrder takes unit whichUnit, string order, real x, real y, widget instantTargetWidget returns boolean
native IssueInstantPointOrderById takes unit whichUnit, integer order, real x, real y, widget instantTargetWidget returns boolean
native IssueInstantTargetOrder takes unit whichUnit, string order, widget targetWidget, widget instantTargetWidget returns boolean
native IssueInstantTargetOrderById takes unit whichUnit, integer order, widget targetWidget, widget instantTargetWidget returns boolean
native IssueBuildOrder takes unit whichPeon, string unitToBuild, real x, real y returns boolean
native IssueBuildOrderById takes unit whichPeon, integer unitId, real x, real y returns boolean
native GetUnitCurrentOrder takes unit whichUnit returns integer
BlzGetUnitAbilityByIndex takes unit whichUnit, integer index returns ability // will just have to loop until it returns nothing
//========================================================================================
globals
hashtable udg_TypeCastHashtable = InitHashtable()
endglobals
library TypeCasting
function Widget2Handle takes widget i returns handle
return i
endfunction
function Agent2Handle takes agent i returns handle
return i
endfunction
function Integer2BooleanExpr takes integer i returns boolexpr
call SaveFogStateHandle(udg_TypeCastHashtable, 0, 0, ConvertFogState(i))
return LoadBooleanExprHandle(udg_TypeCastHashtable, 0, 0)
endfunction
function Handle2BooleanExpr takes handle h returns boolexpr
return Integer2BooleanExpr(GetHandleId(h))
endfunction
function BooleanExpr2Handle takes boolexpr b returns handle
return b
endfunction
endlibrary
scope Example
globals
private hashtable hashData = InitHashtable()
endglobals
struct s_data
unit u = null
unit t = null
real x
real y
integer i
endstruct
function MCADelayed takes nothing returns nothing
local timer t=GetExpiredTimer()
local s_data d=s_data(LoadInteger(hashData, GetHandleId(t), 1))
local player p=GetOwningPlayer(d.u)
local unit u
loop
exitwhen (d.i==0)
set u=CreateUnit(p, 'nmrl', d.x, d.y, 0)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\CrushingWave\\CrushingWaveDamage.mdl",u,"overhead"))
call IssueTargetOrder(u, "attack", d.t)
set d.i=d.i-1
endloop
call RemoveSavedInteger(hashData, GetHandleId(t), 1)
call d.destroy()
set p=null
set u=null
set t=null
endfunction
endscope
function sAI_saveStringParameter takes string data, string lp_addName, string lp_parentString, hashtable ht returns nothing
// The Child key is a function of indexing and that's all. Always 0 in SaveParameter.
local string addName = ""
local string parentString = ""
local integer metaI = 0
local integer metaIC = 0
local boolean nameAlreadyExists = false
//==================================
//===================================================================================
//ZHULI DO THE THING
//===================================================================================
if (lp_addName != "") then
set addName = "_" + lp_addName
endif
set parentString = lp_parentString + addName
call SaveStringBJ(data, 0, StringHashBJ(parentString), ht)
//===================================================================================
//ADD META
//===================================================================================
if (HaveSavedValue(0, bj_HASHTABLE_STRING, StringHashBJ(parentString + "_dataName"), ht)) then
set nameAlreadyExists = true
endif
if ((lp_addName != "") and (nameAlreadyExists == false)) then // check if the name alreadyexists
set metaIC = LoadIntegerBJ(0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
set metaIC = metaIC + 1
call SaveIntegerBJ(metaIC, 0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(lp_parentString + "_metaList_" + I2S(metaIC)), ht)
call SaveStringBJ(I2S(metaIC), 0, StringHashBJ(lp_parentString + "_metaList_" + lp_addName), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_dataName"), ht)
call SaveStringBJ("string", 0, StringHashBJ(parentString + "_dataType"), ht)
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_rootDir"), ht)
endif
// Save Last Created/Added/Saved Parameter
set udg_lastSavedParameterLocString = parentString
set udg_LastSavedParameterNameS = lp_addName
set udg_LastSavedParameterParentS = lp_parentString
set udg_LastSavedParameterHash = ht
endfunction
function sAI_addStringParameter takes string data, string lp_addName, string lp_parentString, hashtable ht returns nothing
// The Child key is a function of indexing and that's all. Always 0 in SaveParameter.
local string addName = ""
local string parentString = ""
local integer metaI = 0
local integer metaIC = 0
local integer i = 0
local integer iC = 0
local string iS = ""
local boolean nameAlreadyExists = false
//==================================
//===================================================================================
//ZHULI DO THE THING
//===================================================================================
if (lp_addName != "") then
set addName = "_" + lp_addName
endif
set parentString = lp_parentString + addName
//Indexing Part//===========
set iC = LoadIntegerBJ(0, StringHashBJ(parentString + "_indexCount"), ht)
set iC = iC + 1
set iS = I2S(iC)
call SaveIntegerBJ(iC, 0, StringHashBJ(parentString + "_indexCount"), ht)
//===========================
call SaveStringBJ(data, 0, StringHashBJ(parentString + "_" + iS), ht)
//===================================================================================
//ADD META
//===================================================================================
if (HaveSavedValue(0, bj_HASHTABLE_STRING, StringHashBJ(parentString + "_dataName"), ht)) then // hopefully this doesn't create any issues w different types
set nameAlreadyExists = true
endif
if ((lp_addName != "") and (nameAlreadyExists == false)) then
set metaIC = LoadIntegerBJ(0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
set metaIC = metaIC + 1
call SaveIntegerBJ(metaIC, 0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(lp_parentString + "_metaList_" + I2S(metaIC)), ht)
call SaveStringBJ(I2S(metaIC), 0, StringHashBJ(lp_parentString + "_metaList_" + lp_addName), ht) // The double naming thing. Also we I2S because that's what we need for that.
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_dataName"), ht)
call SaveStringBJ("string", 0, StringHashBJ(parentString + "_dataType"), ht)
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_rootDir"), ht)
endif
//There is always an index.
call SaveStringBJ(lp_addName, iC, StringHashBJ(parentString + "_" + iS + "_dataName"), ht) // hopefully no flush conflicts
call SaveStringBJ("string", 0, StringHashBJ(parentString + "_" + iS + "_dataType"), ht)
if (lp_addName != "") then
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_" + iS + "_rootDir"), ht)
else
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_" + iS + "_rootDir"), ht)
endif
// Save Last Created/Added/Saved Parameter
set udg_lastSavedParameterLocString = parentString
set udg_LastSavedParameterNameS = lp_addName
set udg_LastSavedParameterParentS = lp_parentString
set udg_LastSavedParameterHash = ht
endfunction
function sAI_saveRealParameter takes real data, string lp_addName, string lp_parentString, hashtable ht returns nothing
// The Child key is a function of indexing and that's all. Always 0 in SaveParameter.
local string addName = ""
local string parentString = ""
local integer metaI = 0
local integer metaIC = 0
local boolean nameAlreadyExists = false
//==================================
//===================================================================================
//ZHULI DO THE THING
//===================================================================================
if (lp_addName != "") then
set addName = "_" + lp_addName
endif
set parentString = lp_parentString + addName
call SaveRealBJ(data, 0, StringHashBJ(parentString), ht)
//===================================================================================
//ADD META
//===================================================================================
if (HaveSavedValue(0, bj_HASHTABLE_STRING, StringHashBJ(parentString + "_dataName"), ht)) then // hopefully this doesn't create any issues
set nameAlreadyExists = true
endif
if ((lp_addName != "") and (nameAlreadyExists == false)) then // check if the name alreadyexists
set metaIC = LoadIntegerBJ(0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
set metaIC = metaIC + 1
call SaveIntegerBJ(metaIC, 0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(lp_parentString + "_metaList_" + I2S(metaIC)), ht)
call SaveStringBJ(I2S(metaIC), 0, StringHashBJ(lp_parentString + "_metaList_" + lp_addName), ht) // The double naming thing. Also we I2S because that's what we need for that.
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_dataName"), ht)
call SaveStringBJ("real", 0, StringHashBJ(parentString + "_dataType"), ht)
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_rootDir"), ht)
endif
// Save Last Created/Added/Saved Parameter
set udg_lastSavedParameterLocString = parentString
set udg_LastSavedParameterNameS = lp_addName
set udg_LastSavedParameterParentS = lp_parentString
set udg_LastSavedParameterHash = ht
endfunction
function sAI_addRealParameter takes real data, string lp_addName, string lp_parentString, hashtable ht returns nothing
// The Child key is a function of indexing and that's all. Always 0 in SaveParameter.
local string addName = ""
local string parentString = ""
local integer metaI = 0
local integer metaIC = 0
local integer i = 0
local integer iC = 0
local string iS = ""
local boolean nameAlreadyExists = false
//==================================
//===================================================================================
//ZHULI DO THE THING
//===================================================================================
if (lp_addName != "") then
set addName = "_" + lp_addName
endif
set parentString = lp_parentString + addName
//Indexing Part//===========
set iC = LoadIntegerBJ(0, StringHashBJ(parentString + "_indexCount"), ht)
set iC = iC + 1
set iS = I2S(iC)
call SaveIntegerBJ(iC, 0, StringHashBJ(parentString + "_indexCount"), ht)
//===========================
call SaveRealBJ(data, 0, StringHashBJ(parentString + "_" + iS), ht)
//===================================================================================
//ADD META
//===================================================================================
if (HaveSavedValue(0, bj_HASHTABLE_STRING, StringHashBJ(parentString + "_dataName"), ht)) then // hopefully this doesn't create any issues w different types - Honestly, I'm not certain what to save an add name as, doesn't even matter I guess
set nameAlreadyExists = true
endif
if ((lp_addName != "") and (nameAlreadyExists == false)) then
set metaIC = LoadIntegerBJ(0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
set metaIC = metaIC + 1
call SaveIntegerBJ(metaIC, 0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(lp_parentString + "_metaList_" + I2S(metaIC)), ht)
call SaveStringBJ(I2S(metaIC), 0, StringHashBJ(lp_parentString + "_metaList_" + lp_addName), ht) // The double naming thing. Also we I2S because that's what we need for that.
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_dataName"), ht)
call SaveStringBJ("real", 0, StringHashBJ(parentString + "_dataType"), ht)
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_rootDir"), ht)
endif
//There is always an index.
call SaveStringBJ(lp_addName, iC, StringHashBJ(parentString + "_" + iS + "_dataName"), ht) // hopefully no flush conflicts
call SaveStringBJ("real", 0, StringHashBJ(parentString + "_" + iS + "_dataType"), ht)
if (lp_addName != "") then
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_" + iS + "_rootDir"), ht)
else
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_" + iS + "_rootDir"), ht)
endif
// Save Last Created/Added/Saved Parameter
set udg_lastSavedParameterLocString = parentString
set udg_LastSavedParameterNameS = lp_addName
set udg_LastSavedParameterParentS = lp_parentString
set udg_LastSavedParameterHash = ht
endfunction
function sAI_saveIntegerParameter takes integer data, string lp_addName, string lp_parentString, hashtable ht returns nothing
local string addName = ""
local string parentString = ""
local integer metaI = 0
local integer metaIC = 0
local boolean nameAlreadyExists = false
//==================================
//===================================================================================
//ZHULI DO THE THING
//===================================================================================
if (lp_addName != "") then
set addName = "_" + lp_addName
endif
set parentString = lp_parentString + addName
call SaveIntegerBJ(data, 0, StringHashBJ(parentString), ht)
//===================================================================================
//ADD META
//===================================================================================
if (HaveSavedValue(0, bj_HASHTABLE_STRING, StringHashBJ(parentString + "_dataName"), ht)) then // hopefully this doesn't create any issues
set nameAlreadyExists = true
endif
if ((lp_addName != "") and (nameAlreadyExists == false)) then // check if the name alreadyexists
set metaIC = LoadIntegerBJ(0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
set metaIC = metaIC + 1
call SaveIntegerBJ(metaIC, 0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(lp_parentString + "_metaList_" + I2S(metaIC)), ht)
call SaveStringBJ(I2S(metaIC), 0, StringHashBJ(lp_parentString + "_metaList_" + lp_addName), ht) // The double naming thing. Also we I2S because that's what we need for that.
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_dataName"), ht)
call SaveStringBJ("integer", 0, StringHashBJ(parentString + "_dataType"), ht)
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_rootDir"), ht)
endif
// Save Last Created/Added/Saved Parameter
set udg_lastSavedParameterLocString = parentString
set udg_LastSavedParameterNameS = lp_addName
set udg_LastSavedParameterParentS = lp_parentString
set udg_LastSavedParameterHash = ht
endfunction
function sAI_addIntegerParameter takes integer data, string lp_addName, string lp_parentString, hashtable ht returns nothing
// The Child key is a function of indexing and that's all. Always 0 in SaveParameter.
local string addName = ""
local string parentString = ""
local integer metaI = 0
local integer metaIC = 0
local integer i = 0
local integer iC = 0
local string iS = ""
local boolean nameAlreadyExists = false
//==================================
//===================================================================================
//ZHULI DO THE THING
//===================================================================================
if (lp_addName != "") then
set addName = "_" + lp_addName
endif
set parentString = lp_parentString + addName
//Indexing Part//===========
set iC = LoadIntegerBJ(0, StringHashBJ(parentString + "_indexCount"), ht)
set iC = iC + 1
set iS = I2S(iC)
call SaveIntegerBJ(iC, 0, StringHashBJ(parentString + "_indexCount"), ht)
//===========================
call SaveIntegerBJ(data, 0, StringHashBJ(parentString + "_" + iS), ht)
//===================================================================================
//ADD META
//===================================================================================
if (HaveSavedValue(0, bj_HASHTABLE_STRING, StringHashBJ(parentString + "_dataName"), ht)) then // hopefully this doesn't create any issues w different types
set nameAlreadyExists = true
endif
if ((lp_addName != "") and (nameAlreadyExists == false)) then
set metaIC = LoadIntegerBJ(0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
set metaIC = metaIC + 1
call SaveIntegerBJ(metaIC, 0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(lp_parentString + "_metaList_" + I2S(metaIC)), ht)
call SaveStringBJ(I2S(metaIC), 0, StringHashBJ(lp_parentString + "_metaList_" + lp_addName), ht) // The double naming thing. Also we I2S because that's what we need for that.
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_dataName"), ht)
call SaveStringBJ("integer", 0, StringHashBJ(parentString + "_dataType"), ht)
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_rootDir"), ht)
endif
//There is always an index.
call SaveStringBJ(lp_addName, iC, StringHashBJ(parentString + "_" + iS + "_dataName"), ht) // hopefully no flush conflicts
call SaveStringBJ("integer", 0, StringHashBJ(parentString + "_" + iS + "_dataType"), ht)
if (lp_addName != "") then
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_" + iS + "_rootDir"), ht)
else
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_" + iS + "_rootDir"), ht)
endif
// Save Last Created/Added/Saved Parameter
set udg_lastSavedParameterLocString = parentString
set udg_LastSavedParameterNameS = lp_addName
set udg_LastSavedParameterParentS = lp_parentString
set udg_LastSavedParameterHash = ht
endfunction
function sAI_saveBooleanParameter takes boolean data, string lp_addName, string lp_parentString, hashtable ht returns nothing
// The Child key is a function of indexing and that's all. Always 0 in SaveParameter.
local string addName = ""
local string parentString = ""
local integer metaI = 0
local integer metaIC = 0
local boolean nameAlreadyExists = false
//==================================
//===================================================================================
//ZHULI DO THE THING
//===================================================================================
if (lp_addName != "") then
set addName = "_" + lp_addName
endif
set parentString = lp_parentString + addName
call SaveBooleanBJ(data, 0, StringHashBJ(parentString), ht)
//===================================================================================
//ADD META
//===================================================================================
if (HaveSavedValue(0, bj_HASHTABLE_STRING, StringHashBJ(parentString + "_dataName"), ht)) then // hopefully this doesn't create any issues
set nameAlreadyExists = true
endif
if ((lp_addName != "") and (nameAlreadyExists == false)) then // check if the name alreadyexists
set metaIC = LoadIntegerBJ(0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
set metaIC = metaIC + 1
call SaveIntegerBJ(metaIC, 0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(lp_parentString + "_metaList_" + I2S(metaIC)), ht)
call SaveStringBJ(I2S(metaIC), 0, StringHashBJ(lp_parentString + "_metaList_" + lp_addName), ht) // The double naming thing. Also we I2S because that's what we need for that.
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_dataName"), ht)
call SaveStringBJ("boolean", 0, StringHashBJ(parentString + "_dataType"), ht)
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_rootDir"), ht)
endif
// Save Last Created/Added/Saved Parameter
set udg_lastSavedParameterLocString = parentString
set udg_LastSavedParameterNameS = lp_addName
set udg_LastSavedParameterParentS = lp_parentString
set udg_LastSavedParameterHash = ht
endfunction
function sAI_addBooleanParameter takes boolean data, string lp_addName, string lp_parentString, hashtable ht returns nothing
// The Child key is a function of indexing and that's all. Always 0 in SaveParameter.
local string addName = ""
local string parentString = ""
local integer metaI = 0
local integer metaIC = 0
local integer i = 0
local integer iC = 0
local string iS = ""
local boolean nameAlreadyExists = false
//==================================
//===================================================================================
//ZHULI DO THE THING
//===================================================================================
if (lp_addName != "") then
set addName = "_" + lp_addName
endif
set parentString = lp_parentString + addName
//Indexing Part//===========
set iC = LoadIntegerBJ(0, StringHashBJ(parentString + "_indexCount"), ht)
set iC = iC + 1
set iS = I2S(iC)
call SaveIntegerBJ(iC, 0, StringHashBJ(parentString + "_indexCount"), ht)
//===========================
call SaveBooleanBJ(data, 0, StringHashBJ(parentString + "_" + iS), ht)
//===================================================================================
//ADD META
//===================================================================================
if (HaveSavedValue(0, bj_HASHTABLE_STRING, StringHashBJ(parentString + "_dataName"), ht)) then // hopefully this doesn't create any issues w different types
set nameAlreadyExists = true
endif
if ((lp_addName != "") and (nameAlreadyExists == false)) then
set metaIC = LoadIntegerBJ(0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
set metaIC = metaIC + 1
call SaveIntegerBJ(metaIC, 0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(lp_parentString + "_metaList_" + I2S(metaIC)), ht)
call SaveStringBJ(I2S(metaIC), 0, StringHashBJ(lp_parentString + "_metaList_" + lp_addName), ht) // The double naming thing. Also we I2S because that's what we need for that.
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_dataName"), ht)
call SaveStringBJ("integer", 0, StringHashBJ(parentString + "_dataType"), ht)
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_rootDir"), ht)
endif
//There is always an index.
call SaveStringBJ(lp_addName, iC, StringHashBJ(parentString + "_" + iS + "_dataName"), ht) // hopefully no flush conflicts
call SaveStringBJ("boolean", 0, StringHashBJ(parentString + "_" + iS + "_dataType"), ht)
if (lp_addName != "") then
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_" + iS + "_rootDir"), ht)
else
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_" + iS + "_rootDir"), ht)
endif
// Save Last Created/Added/Saved Parameter
set udg_lastSavedParameterLocString = parentString
set udg_LastSavedParameterNameS = lp_addName
set udg_LastSavedParameterParentS = lp_parentString
set udg_LastSavedParameterHash = ht
endfunction
function sAI_saveUnitParameter takes unit data, string lp_addName, string lp_parentString, hashtable ht returns nothing
// The Child key is a function of indexing and that's all. Always 0 in SaveParameter.
local string addName = ""
local string parentString = ""
local integer metaI = 0
local integer metaIC = 0
local boolean nameAlreadyExists = false
//==================================
//===================================================================================
//ZHULI DO THE THING
//===================================================================================
if (lp_addName != "") then
set addName = "_" + lp_addName
endif
set parentString = lp_parentString + addName
call SaveUnitHandleBJ(data, 0, StringHashBJ(parentString), ht)
//===================================================================================
//ADD META
//===================================================================================
if (HaveSavedValue(0, bj_HASHTABLE_STRING, StringHashBJ(parentString + "_dataName"), ht)) then // hopefully this doesn't create any issues
set nameAlreadyExists = true
endif
if ((lp_addName != "") and (nameAlreadyExists == false)) then // check if the name alreadyexists
set metaIC = LoadIntegerBJ(0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
set metaIC = metaIC + 1
call SaveIntegerBJ(metaIC, 0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(lp_parentString + "_metaList_" + I2S(metaIC)), ht)
call SaveStringBJ(I2S(metaIC), 0, StringHashBJ(lp_parentString + "_metaList_" + lp_addName), ht) // The double naming thing. Also we I2S because that's what we need for that.
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_dataName"), ht)
call SaveStringBJ("unit", 0, StringHashBJ(parentString + "_dataType"), ht)
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_rootDir"), ht)
endif
// Save Last Created/Added/Saved Parameter
set udg_lastSavedParameterLocString = parentString
set udg_LastSavedParameterNameS = lp_addName
set udg_LastSavedParameterParentS = lp_parentString
set udg_LastSavedParameterHash = ht
endfunction
function sAI_addUnitParameter takes unit data, string lp_addName, string lp_parentString, hashtable ht returns nothing
// The Child key is a function of indexing and that's all. Always 0 in SaveParameter.
local string addName = ""
local string parentString = ""
local integer metaI = 0
local integer metaIC = 0
local integer i = 0
local integer iC = 0
local string iS = ""
local boolean nameAlreadyExists = false
//==================================
//===================================================================================
//ZHULI DO THE THING
//===================================================================================
if (lp_addName != "") then
set addName = "_" + lp_addName
endif
set parentString = lp_parentString + addName
//Indexing Part//===========
set iC = LoadIntegerBJ(0, StringHashBJ(parentString + "_indexCount"), ht)
set iC = iC + 1
set iS = I2S(iC)
call SaveIntegerBJ(iC, 0, StringHashBJ(parentString + "_indexCount"), ht)
//===========================
call SaveUnitHandleBJ(data, 0, StringHashBJ(parentString + "_" + iS), ht)
//===================================================================================
//ADD META
//===================================================================================
if (HaveSavedValue(0, bj_HASHTABLE_STRING, StringHashBJ(parentString + "_dataName"), ht)) then // hopefully this doesn't create any issues w different types
set nameAlreadyExists = true
endif
if ((lp_addName != "") and (nameAlreadyExists == false)) then
set metaIC = LoadIntegerBJ(0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
set metaIC = metaIC + 1
call SaveIntegerBJ(metaIC, 0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(lp_parentString + "_metaList_" + I2S(metaIC)), ht)
call SaveStringBJ(I2S(metaIC), 0, StringHashBJ(lp_parentString + "_metaList_" + lp_addName), ht) // The double naming thing. Also we I2S because that's what we need for that.
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_dataName"), ht)
call SaveStringBJ("unit", 0, StringHashBJ(parentString + "_dataType"), ht)
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_rootDir"), ht)
endif
//There is always an index.
call SaveStringBJ(lp_addName, iC, StringHashBJ(parentString + "_" + iS + "_dataName"), ht) // hopefully no flush conflicts
call SaveStringBJ("unit", 0, StringHashBJ(parentString + "_" + iS + "_dataType"), ht)
if (lp_addName != "") then
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_" + iS + "_rootDir"), ht)
else
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_" + iS + "_rootDir"), ht)
endif
// Save Last Created/Added/Saved Parameter
set udg_lastSavedParameterLocString = parentString
set udg_LastSavedParameterNameS = lp_addName
set udg_LastSavedParameterParentS = lp_parentString
set udg_LastSavedParameterHash = ht
endfunction
function sAI_saveLocationParameter takes location data, string lp_addName, string lp_parentString, hashtable ht returns nothing
// The Child key is a function of indexing and that's all. Always 0 in SaveParameter.
local string addName = ""
local string parentString = ""
local integer metaI = 0
local integer metaIC = 0
local boolean nameAlreadyExists = false
//==================================
//===================================================================================
//ZHULI DO THE THING
//===================================================================================
if (lp_addName != "") then
set addName = "_" + lp_addName
endif
set parentString = lp_parentString + addName
call SaveLocationHandleBJ(data, 0, StringHashBJ(parentString), ht)
//===================================================================================
//ADD META
//===================================================================================
if (HaveSavedValue(0, bj_HASHTABLE_STRING, StringHashBJ(parentString + "_dataName"), ht)) then // hopefully this doesn't create any issues
set nameAlreadyExists = true
endif
if ((lp_addName != "") and (nameAlreadyExists == false)) then // check if the name alreadyexists
set metaIC = LoadIntegerBJ(0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
set metaIC = metaIC + 1
call SaveIntegerBJ(metaIC, 0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(lp_parentString + "_metaList_" + I2S(metaIC)), ht)
call SaveStringBJ(I2S(metaIC), 0, StringHashBJ(lp_parentString + "_metaList_" + lp_addName), ht) // The double naming thing. Also we I2S because that's what we need for that.
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_dataName"), ht)
call SaveStringBJ("location", 0, StringHashBJ(parentString + "_dataType"), ht)
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_rootDir"), ht)
endif
// Save Last Created/Added/Saved Parameter
set udg_lastSavedParameterLocString = parentString
set udg_LastSavedParameterNameS = lp_addName
set udg_LastSavedParameterParentS = lp_parentString
set udg_LastSavedParameterHash = ht
endfunction
function sAI_addLocationParameter takes location data, string lp_addName, string lp_parentString, hashtable ht returns nothing
local string addName = ""
local string parentString = ""
local integer metaI = 0
local integer metaIC = 0
local integer i = 0
local integer iC = 0
local string iS = ""
local boolean nameAlreadyExists = false
//==================================
//===================================================================================
//ZHULI DO THE THING
//===================================================================================
if (lp_addName != "") then
set addName = "_" + lp_addName
endif
set parentString = lp_parentString + addName
//Indexing Part//===========
set iC = LoadIntegerBJ(0, StringHashBJ(parentString + "_indexCount"), ht)
set iC = iC + 1
set iS = I2S(iC)
call SaveIntegerBJ(iC, 0, StringHashBJ(parentString + "_indexCount"), ht)
//===========================
call SaveLocationHandleBJ(data, 0, StringHashBJ(parentString + "_" + iS), ht)
//===================================================================================
//ADD META
//===================================================================================
if (HaveSavedValue(0, bj_HASHTABLE_STRING, StringHashBJ(parentString + "_dataName"), ht)) then // hopefully this doesn't create any issues w different types
set nameAlreadyExists = true
endif
if ((lp_addName != "") and (nameAlreadyExists == false)) then
set metaIC = LoadIntegerBJ(0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
set metaIC = metaIC + 1
call SaveIntegerBJ(metaIC, 0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(lp_parentString + "_metaList_" + I2S(metaIC)), ht)
call SaveStringBJ(I2S(metaIC), 0, StringHashBJ(lp_parentString + "_metaList_" + lp_addName), ht) // The double naming thing. Also we I2S because that's what we need for that.
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_dataName"), ht)
call SaveStringBJ("location", 0, StringHashBJ(parentString + "_dataType"), ht)
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_rootDir"), ht)
endif
//There is always an index.
call SaveStringBJ(lp_addName, iC, StringHashBJ(parentString + "_" + iS + "_dataName"), ht) // hopefully no flush conflicts
call SaveStringBJ("location", 0, StringHashBJ(parentString + "_" + iS + "_dataType"), ht)
if (lp_addName != "") then
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_" + iS + "_rootDir"), ht)
else
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_" + iS + "_rootDir"), ht)
endif
// Save Last Created/Added/Saved Parameter
set udg_lastSavedParameterLocString = parentString
set udg_LastSavedParameterNameS = lp_addName
set udg_LastSavedParameterParentS = lp_parentString
set udg_LastSavedParameterHash = ht
endfunction
function sAI_saveGroupParameter takes group data, string lp_addName, string lp_parentString, hashtable ht returns nothing
local string addName = ""
local string parentString = ""
local integer metaI = 0
local integer metaIC = 0
local boolean nameAlreadyExists = false
//==================================
//===================================================================================
//ZHULI DO THE THING
//===================================================================================
if (lp_addName != "") then
set addName = "_" + lp_addName
endif
set parentString = lp_parentString + addName
call SaveGroupHandleBJ(data, 0, StringHashBJ(parentString), ht)
//===================================================================================
//ADD META
//===================================================================================
if (HaveSavedValue(0, bj_HASHTABLE_STRING, StringHashBJ(parentString + "_dataName"), ht)) then // hopefully this doesn't create any issues
set nameAlreadyExists = true
endif
if ((lp_addName != "") and (nameAlreadyExists == false)) then // check if the name alreadyexists
set metaIC = LoadIntegerBJ(0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
set metaIC = metaIC + 1
call SaveIntegerBJ(metaIC, 0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(lp_parentString + "_metaList_" + I2S(metaIC)), ht)
call SaveStringBJ(I2S(metaIC), 0, StringHashBJ(lp_parentString + "_metaList_" + lp_addName), ht) // The double naming thing. Also we I2S because that's what we need for that.
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_dataName"), ht)
call SaveStringBJ("group", 0, StringHashBJ(parentString + "_dataType"), ht)
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_rootDir"), ht)
endif
// Save Last Created/Added/Saved Parameter
set udg_lastSavedParameterLocString = parentString
set udg_LastSavedParameterNameS = lp_addName
set udg_LastSavedParameterParentS = lp_parentString
set udg_LastSavedParameterHash = ht
endfunction
function sAI_addGroupParameter takes group data, string lp_addName, string lp_parentString, hashtable ht returns nothing
local string addName = ""
local string parentString = ""
local integer metaI = 0
local integer metaIC = 0
local integer i = 0
local integer iC = 0
local string iS = ""
local boolean nameAlreadyExists = false
//==================================
//===================================================================================
//ZHULI DO THE THING
//===================================================================================
if (lp_addName != "") then
set addName = "_" + lp_addName
endif
set parentString = lp_parentString + addName
//Indexing Part//===========
set iC = LoadIntegerBJ(0, StringHashBJ(parentString + "_indexCount"), ht)
set iC = iC + 1
set iS = I2S(iC)
call SaveIntegerBJ(iC, 0, StringHashBJ(parentString + "_indexCount"), ht)
//===========================
call SaveGroupHandleBJ(data, 0, StringHashBJ(parentString + "_" + iS), ht)
//===================================================================================
//ADD META
//===================================================================================
if (HaveSavedValue(0, bj_HASHTABLE_STRING, StringHashBJ(parentString + "_dataName"), ht)) then // hopefully this doesn't create any issues w different types
set nameAlreadyExists = true
endif
if ((lp_addName != "") and (nameAlreadyExists == false)) then
set metaIC = LoadIntegerBJ(0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
set metaIC = metaIC + 1
call SaveIntegerBJ(metaIC, 0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(lp_parentString + "_metaList_" + I2S(metaIC)), ht)
call SaveStringBJ(I2S(metaIC), 0, StringHashBJ(lp_parentString + "_metaList_" + lp_addName), ht) // The double naming thing. Also we I2S because that's what we need for that.
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_dataName"), ht)
call SaveStringBJ("group", 0, StringHashBJ(parentString + "_dataType"), ht)
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_rootDir"), ht)
endif
//There is always an index.
call SaveStringBJ(lp_addName, iC, StringHashBJ(parentString + "_" + iS + "_dataName"), ht) // hopefully no flush conflicts
call SaveStringBJ("group", 0, StringHashBJ(parentString + "_" + iS + "_dataType"), ht)
if (lp_addName != "") then
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_" + iS + "_rootDir"), ht)
else
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_" + iS + "_rootDir"), ht)
endif
// Save Last Created/Added/Saved Parameter
set udg_lastSavedParameterLocString = parentString
set udg_LastSavedParameterNameS = lp_addName
set udg_LastSavedParameterParentS = lp_parentString
set udg_LastSavedParameterHash = ht
endfunction
function sAI_saveRegionParameter takes region data, string lp_addName, string lp_parentString, hashtable ht returns nothing
local string addName = ""
local string parentString = ""
local integer metaI = 0
local integer metaIC = 0
local boolean nameAlreadyExists = false
//==================================
//===================================================================================
//ZHULI DO THE THING
//===================================================================================
if (lp_addName != "") then
set addName = "_" + lp_addName
endif
set parentString = lp_parentString + addName
call SaveRegionHandleBJ(data, 0, StringHashBJ(parentString), ht)
//===================================================================================
//ADD META
//===================================================================================
if (HaveSavedValue(0, bj_HASHTABLE_STRING, StringHashBJ(parentString + "_dataName"), ht)) then // hopefully this doesn't create any issues
set nameAlreadyExists = true
endif
if ((lp_addName != "") and (nameAlreadyExists == false)) then // check if the name alreadyexists
set metaIC = LoadIntegerBJ(0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
set metaIC = metaIC + 1
call SaveIntegerBJ(metaIC, 0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(lp_parentString + "_metaList_" + I2S(metaIC)), ht)
call SaveStringBJ(I2S(metaIC), 0, StringHashBJ(lp_parentString + "_metaList_" + lp_addName), ht) // The double naming thing. Also we I2S because that's what we need for that.
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_dataName"), ht)
call SaveStringBJ("region", 0, StringHashBJ(parentString + "_dataType"), ht)
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_rootDir"), ht)
endif
// Save Last Created/Added/Saved Parameter
set udg_lastSavedParameterLocString = parentString
set udg_LastSavedParameterNameS = lp_addName
set udg_LastSavedParameterParentS = lp_parentString
set udg_LastSavedParameterHash = ht
endfunction
function sAI_addRegionParameter takes region data, string lp_addName, string lp_parentString, hashtable ht returns nothing
local string addName = ""
local string parentString = ""
local integer metaI = 0
local integer metaIC = 0
local integer i = 0
local integer iC = 0
local string iS = ""
local boolean nameAlreadyExists = false
//==================================
//===================================================================================
//ZHULI DO THE THING
//===================================================================================
if (lp_addName != "") then
set addName = "_" + lp_addName
endif
set parentString = lp_parentString + addName
//Indexing Part//===========
set iC = LoadIntegerBJ(0, StringHashBJ(parentString + "_indexCount"), ht)
set iC = iC + 1
set iS = I2S(iC)
call SaveIntegerBJ(iC, 0, StringHashBJ(parentString + "_indexCount"), ht)
//===========================
call SaveRegionHandleBJ(data, 0, StringHashBJ(parentString + "_" + iS), ht)
//===================================================================================
//ADD META
//===================================================================================
if (HaveSavedValue(0, bj_HASHTABLE_STRING, StringHashBJ(parentString + "_dataName"), ht)) then // hopefully this doesn't create any issues w different types
set nameAlreadyExists = true
endif
if ((lp_addName != "") and (nameAlreadyExists == false)) then
set metaIC = LoadIntegerBJ(0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
set metaIC = metaIC + 1
call SaveIntegerBJ(metaIC, 0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(lp_parentString + "_metaList_" + I2S(metaIC)), ht)
call SaveStringBJ(I2S(metaIC), 0, StringHashBJ(lp_parentString + "_metaList_" + lp_addName), ht) // The double naming thing. Also we I2S because that's what we need for that.
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_dataName"), ht)
call SaveStringBJ("region", 0, StringHashBJ(parentString + "_dataType"), ht)
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_rootDir"), ht)
endif
//There is always an index.
call SaveStringBJ(lp_addName, iC, StringHashBJ(parentString + "_" + iS + "_dataName"), ht) // hopefully no flush conflicts
call SaveStringBJ("location", 0, StringHashBJ(parentString + "_" + iS + "_dataType"), ht)
if (lp_addName != "") then
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_" + iS + "_rootDir"), ht)
else
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_" + iS + "_rootDir"), ht)
endif
// Save Last Created/Added/Saved Parameter
set udg_lastSavedParameterLocString = parentString
set udg_LastSavedParameterNameS = lp_addName
set udg_LastSavedParameterParentS = lp_parentString
set udg_LastSavedParameterHash = ht
endfunction
function sAI_saveRectParameter takes rect data, string lp_addName, string lp_parentString, hashtable ht returns nothing
local string addName = ""
local string parentString = ""
local integer metaI = 0
local integer metaIC = 0
local boolean nameAlreadyExists = false
//==================================
//===================================================================================
//ZHULI DO THE THING
//===================================================================================
if (lp_addName != "") then
set addName = "_" + lp_addName
endif
set parentString = lp_parentString + addName
call SaveRectHandleBJ(data, 0, StringHashBJ(parentString), ht)
//===================================================================================
//ADD META
//===================================================================================
if (HaveSavedValue(0, bj_HASHTABLE_STRING, StringHashBJ(parentString + "_dataName"), ht)) then // hopefully this doesn't create any issues
set nameAlreadyExists = true
endif
if ((lp_addName != "") and (nameAlreadyExists == false)) then // check if the name alreadyexists
set metaIC = LoadIntegerBJ(0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
set metaIC = metaIC + 1
call SaveIntegerBJ(metaIC, 0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(lp_parentString + "_metaList_" + I2S(metaIC)), ht)
call SaveStringBJ(I2S(metaIC), 0, StringHashBJ(lp_parentString + "_metaList_" + lp_addName), ht) // The double naming thing. Also we I2S because that's what we need for that.
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_dataName"), ht)
call SaveStringBJ("rect", 0, StringHashBJ(parentString + "_dataType"), ht)
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_rootDir"), ht)
endif
// Save Last Created/Added/Saved Parameter
set udg_lastSavedParameterLocString = parentString
set udg_LastSavedParameterNameS = lp_addName
set udg_LastSavedParameterParentS = lp_parentString
set udg_LastSavedParameterHash = ht
endfunction
function sAI_addRectParameter takes rect data, string lp_addName, string lp_parentString, hashtable ht returns nothing
local string addName = ""
local string parentString = ""
local integer metaI = 0
local integer metaIC = 0
local integer i = 0
local integer iC = 0
local string iS = ""
local boolean nameAlreadyExists = false
//==================================
//===================================================================================
//ZHULI DO THE THING
//===================================================================================
if (lp_addName != "") then
set addName = "_" + lp_addName
endif
set parentString = lp_parentString + addName
//Indexing Part//===========
set iC = LoadIntegerBJ(0, StringHashBJ(parentString + "_indexCount"), ht)
set iC = iC + 1
set iS = I2S(iC)
call SaveIntegerBJ(iC, 0, StringHashBJ(parentString + "_indexCount"), ht)
//===========================
call SaveRectHandleBJ(data, 0, StringHashBJ(parentString + "_" + iS), ht)
//===================================================================================
//ADD META
//===================================================================================
if (HaveSavedValue(0, bj_HASHTABLE_STRING, StringHashBJ(parentString + "_dataName"), ht)) then // hopefully this doesn't create any issues w different types
set nameAlreadyExists = true
endif
if ((lp_addName != "") and (nameAlreadyExists == false)) then
set metaIC = LoadIntegerBJ(0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
set metaIC = metaIC + 1
call SaveIntegerBJ(metaIC, 0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(lp_parentString + "_metaList_" + I2S(metaIC)), ht)
call SaveStringBJ(I2S(metaIC), 0, StringHashBJ(lp_parentString + "_metaList_" + lp_addName), ht) // The double naming thing. Also we I2S because that's what we need for that.
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_dataName"), ht)
call SaveStringBJ("rect", 0, StringHashBJ(parentString + "_dataType"), ht)
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_rootDir"), ht)
endif
//There is always an index.
call SaveStringBJ(lp_addName, iC, StringHashBJ(parentString + "_" + iS + "_dataName"), ht) // hopefully no flush conflicts
call SaveStringBJ("location", 0, StringHashBJ(parentString + "_" + iS + "_dataType"), ht)
if (lp_addName != "") then
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_" + iS + "_rootDir"), ht)
else
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_" + iS + "_rootDir"), ht)
endif
// Save Last Created/Added/Saved Parameter
set udg_lastSavedParameterLocString = parentString
set udg_LastSavedParameterNameS = lp_addName
set udg_LastSavedParameterParentS = lp_parentString
set udg_LastSavedParameterHash = ht
endfunction
function sAI_saveTimerParameter takes timer data, string lp_addName, string lp_parentString, hashtable ht returns nothing
local string addName = ""
local string parentString = ""
local integer metaI = 0
local integer metaIC = 0
local boolean nameAlreadyExists = false
//==================================
//===================================================================================
//ZHULI DO THE THING
//===================================================================================
if (lp_addName != "") then
set addName = "_" + lp_addName
endif
set parentString = lp_parentString + addName
call SaveTimerHandleBJ(data, 0, StringHashBJ(parentString), ht)
//===================================================================================
//ADD META
//===================================================================================
if (HaveSavedValue(0, bj_HASHTABLE_STRING, StringHashBJ(parentString + "_dataName"), ht)) then // hopefully this doesn't create any issues
set nameAlreadyExists = true
endif
if ((lp_addName != "") and (nameAlreadyExists == false)) then // check if the name alreadyexists
set metaIC = LoadIntegerBJ(0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
set metaIC = metaIC + 1
call SaveIntegerBJ(metaIC, 0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(lp_parentString + "_metaList_" + I2S(metaIC)), ht)
call SaveStringBJ(I2S(metaIC), 0, StringHashBJ(lp_parentString + "_metaList_" + lp_addName), ht) // The double naming thing. Also we I2S because that's what we need for that.
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_dataName"), ht)
call SaveStringBJ("timer", 0, StringHashBJ(parentString + "_dataType"), ht)
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_rootDir"), ht)
endif
// Save Last Created/Added/Saved Parameter
set udg_lastSavedParameterLocString = parentString
set udg_LastSavedParameterNameS = lp_addName
set udg_LastSavedParameterParentS = lp_parentString
set udg_LastSavedParameterHash = ht
endfunction
function sAI_addTimerParameter takes timer data, string lp_addName, string lp_parentString, hashtable ht returns nothing
local string addName = ""
local string parentString = ""
local integer metaI = 0
local integer metaIC = 0
local integer i = 0
local integer iC = 0
local string iS = ""
local boolean nameAlreadyExists = false
//==================================
//===================================================================================
//ZHULI DO THE THING
//===================================================================================
if (lp_addName != "") then
set addName = "_" + lp_addName
endif
set parentString = lp_parentString + addName
//Indexing Part//===========
set iC = LoadIntegerBJ(0, StringHashBJ(parentString + "_indexCount"), ht)
set iC = iC + 1
set iS = I2S(iC)
call SaveIntegerBJ(iC, 0, StringHashBJ(parentString + "_indexCount"), ht)
//===========================
call SaveTimerHandleBJ(data, 0, StringHashBJ(parentString + "_" + iS), ht)
//===================================================================================
//ADD META
//===================================================================================
if (HaveSavedValue(0, bj_HASHTABLE_STRING, StringHashBJ(parentString + "_dataName"), ht)) then // hopefully this doesn't create any issues w different types
set nameAlreadyExists = true
endif
if ((lp_addName != "") and (nameAlreadyExists == false)) then
set metaIC = LoadIntegerBJ(0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
set metaIC = metaIC + 1
call SaveIntegerBJ(metaIC, 0, StringHashBJ(lp_parentString + "_metaList_indexCount"), ht)
call SaveStringBJ(lp_addName, 0, StringHashBJ(lp_parentString + "_metaList_" + I2S(metaIC)), ht)
call SaveStringBJ(I2S(metaIC), 0, StringHashBJ(lp_parentString + "_metaList_" + lp_addName), ht) // The double naming thing. Also we I2S because that's what we need for that.
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_dataName"), ht)
call SaveStringBJ("timer", 0, StringHashBJ(parentString + "_dataType"), ht)
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_rootDir"), ht)
endif
//There is always an index.
call SaveStringBJ(lp_addName, iC, StringHashBJ(parentString + "_" + iS + "_dataName"), ht) // hopefully no flush conflicts
call SaveStringBJ("location", 0, StringHashBJ(parentString + "_" + iS + "_dataType"), ht)
if (lp_addName != "") then
call SaveStringBJ(lp_addName, 0, StringHashBJ(parentString + "_" + iS + "_rootDir"), ht)
else
call SaveStringBJ(lp_parentString, 0, StringHashBJ(parentString + "_" + iS + "_rootDir"), ht)
endif
// Save Last Created/Added/Saved Parameter
set udg_lastSavedParameterLocString = parentString
set udg_LastSavedParameterNameS = lp_addName
set udg_LastSavedParameterParentS = lp_parentString
set udg_LastSavedParameterHash = ht
endfunction
function sAI_convertUnitAbilitiesToHashKnowledge takes integer lp_playerID, unit lp_unit returns nothing
local integer i = 0
local integer lv_indexCount = 0
local ability lv_abil = null
local string lv_abilString = ""
loop
exitwhen i > lv_indexCount
set lv_abil = BlzGetUnitAbilityByIndex(lp_unit, i)
set lv_abilString = I2S(GetHandleIdBJ(lv_abil))
call sAI_addStringParameterToHash("", "PlayerAI_terms", "ability", lv_abilString, udg_PlayerAI[lp_playerID])
endloop
endfunction
function sAI_deleteDataTree takes string targetLocString, hashtable ht returns nothing
local integer indexI = 0
local integer indexIC = 0
local integer metaI = 0
local integer metaIC = 0
local string rootString = ""
local string name = ""
local string str = ""
local string fieldString = ""
local string prefix = ""
local boolean processingIndex = false
//================
local hashtable dT_trackingData = udg_dT_trackingData
local integer dT_i = 0
local string dT_targetLocString = ""
local string dT_iString = ""
local string dT_prefix = ""
local integer dT_iC = 0
//================
local integer targetLocStringIC = 0
local integer dT_fieldI = 0
local string dT_fieldIString = ""
local integer dT_fieldIC = 0
local integer dT_fieldMetaI = 0
local integer dT_fieldMetaIC = 0
local string dT_fieldMetaIString = ""
local string dT_fieldMetaNameString = ""
local integer targetLocStringMIC = 0
//================
local string dT_rootName = ""
local string dT_saveRootName = ""
local string dT_name = ""
local string dT_saveName = ""
local string dT_addName = ""
local boolean processFinished = false
local boolean backstep = false
local boolean hitLastEntry = false
local boolean transfer = false
local integer deleteSL = 0
local integer i = 0
local string iS = ""
local string filterString = ""
local boolean isIndexed = false
local boolean forward = false
local integer entriesDeleted = 0
local integer debugInt = 0
local integer childKey = 0
local string addName = ""
local string dataType = ""
//============================================
//MAIN PART
//============================================
//=====================================
//=====================================
set processFinished = false
//=====================================
set dT_rootName = LoadStringBJ(0, StringHashBJ(dT_targetLocString + "_rootDir"), ht)
set dT_targetLocString = targetLocString
//==========================================
//==========================================
//==========================================
//==========================================
//MAIN FUNCTION
loop
exitwhen (processFinished == true)
set dT_fieldIC = LoadIntegerBJ( 0, StringHashBJ(dT_targetLocString + "_indexCount"), ht)
set dT_fieldMetaIC = LoadIntegerBJ( 0, StringHashBJ(dT_targetLocString + "_metaList_indexCount"), ht)
set dT_fieldI = LoadIntegerBJ( 0, StringHashBJ(dT_targetLocString + "_currentIndex"), dT_trackingData)
set dT_fieldMetaI = LoadIntegerBJ( 0, StringHashBJ(dT_targetLocString + "_currentMetaIndex"), dT_trackingData)
// ACTUAL TRANSFER PROCESS
//deleting all the save names, cos it's not a transfer
if (dT_targetLocString == targetLocString) then // This is the stop function, so it doesn't delete prior to target locString
elseif (LoadBooleanBJ(0, StringHashBJ(dT_targetLocString + "_transferred"), dT_trackingData) != true) then
call SaveBooleanBJ(true, 0, StringHashBJ( dT_targetLocString + "_transferred"), dT_trackingData) // still need this
//==========================================
//==========================================
//==========================================
//==========================================
//==========================================
//==========================================
//==========================================
//ACTUAL PROCESS
//DELETE DATA HERE (REMOVE MEMORY LEAKS)
// I wonder if I also have to null the hashtable values? Shouldn't they clear automatically with the Flush? I assume so.
// I suppose I could just go if handle, then destroy, everything but units prob, since I think anything I don't destroy would just be a reference
if (dataType == "group") then
call DestroyGroup(LoadGroupHandleBJ(0, StringHashBJ(dT_targetLocString), ht))
endif
if (dataType == "location") then
call RemoveLocation(LoadLocationHandleBJ(0, StringHashBJ(dT_targetLocString), ht))
endif
if (dataType == "region") then
call RemoveRegion(LoadRegionHandleBJ(0, StringHashBJ(dT_targetLocString), ht))
endif
if (dataType == "rect") then
call RemoveRect(LoadRectHandleBJ(0, StringHashBJ(dT_targetLocString), ht))
endif
// I think I do need to read type, actually, if I save memory using things like locations i need to destroy before flushing hash.
// At the moment I just have string parameters so no big, I'm pretty sure.
// Key memory leaks are taken care of by Flush.
//==========================================
//==========================================
//==========================================
//==========================================
//==========================================
//==========================================
//==========================================
//FLUSH DATA HASHTABLE
set addName = LoadStringBJ(0, StringHashBJ(dT_targetLocString + "_dataName"), ht )
set dataType = LoadStringBJ(0, StringHashBJ(dT_targetLocString + "_dataType"), ht )
call FlushChildHashtableBJ( StringHashBJ(dT_targetLocString), ht ) // might not need the previous , flushing an entire index should be fine
call FlushChildHashtableBJ( StringHashBJ(dT_targetLocString + "_indexCount"), ht )
call FlushChildHashtableBJ( StringHashBJ(dT_targetLocString + "_dataName"), ht )
call FlushChildHashtableBJ( StringHashBJ(dT_targetLocString + "_dataType"), ht )
call FlushChildHashtableBJ( StringHashBJ(dT_targetLocString + "_rootDir"), ht )
//And delete all the in-built and all the meta, too.
// I think this checks off everything.
call FlushChildHashtableBJ( StringHashBJ(dT_targetLocString + "_metaList_" + LoadStringBJ(0, StringHashBJ(dT_targetLocString + "_metaList_" + addName), ht) ), ht )
call FlushChildHashtableBJ( StringHashBJ(dT_targetLocString + "_metaList_" + addName), ht )
//==========================================
//==========================================
//==========================================
//==========================================
//==========================================
//==========================================
//==========================================
//==========================================
set entriesDeleted = entriesDeleted + 1
else
set backstep = false
endif
//ITERATION
if ( ( (LoadIntegerBJ(0, StringHashBJ(dT_targetLocString + "_indexCount"), ht) == 0) and (LoadIntegerBJ(0, StringHashBJ(dT_targetLocString + "_metaList_indexCount"), ht) == 0) ) or ((dT_fieldI >= dT_fieldIC) and (dT_fieldMetaI >= dT_fieldMetaIC)) ) then
set backstep = true
else
set dT_rootName = dT_targetLocString
if (dT_fieldI < dT_fieldIC) then
set dT_fieldI = dT_fieldI + 1
set dT_fieldIString = (I2S(dT_fieldI))
set dT_addName = dT_fieldIString
else
if (dT_fieldMetaI < dT_fieldMetaIC) then
set dT_fieldMetaI = dT_fieldMetaI + 1
set dT_fieldMetaIString = (I2S(dT_fieldMetaI))
set dT_addName = LoadStringBJ(0, StringHashBJ(dT_targetLocString + "_metaList_" + dT_fieldMetaIString), ht)
else
set dT_fieldMetaIString = (I2S(dT_fieldMetaI))
set dT_addName = LoadStringBJ(0, StringHashBJ(dT_targetLocString + "_metaList_" + dT_fieldMetaIString), ht)
endif
endif
endif
call SaveIntegerBJ(dT_fieldI, 0, StringHashBJ(dT_targetLocString + "_currentIndex"), dT_trackingData)
call SaveIntegerBJ(dT_fieldMetaI, 0, StringHashBJ(dT_targetLocString + "_currentMetaIndex"), dT_trackingData)
//==================================
//==================================
//TRACKING - FORWARD OR BACKWARDS
//==================================
//==================================
if (((dT_targetLocString == "") or ( dT_targetLocString == targetLocString)) and (backstep == true)) then
set processFinished = true
elseif (debugInt > 100) then
set processFinished = true
else
set debugInt = debugInt + 1
endif
//=====================================
//=====================================
//=====================================
if (backstep == true) then
set dT_targetLocString = LoadStringBJ(0, StringHashBJ(dT_targetLocString + "_rootDir"), ht)
else
set dT_targetLocString = dT_rootName + "_" + dT_addName
endif
endloop
call FlushParentHashtableBJ(dT_trackingData)
//============================================
//PLUG LEAKS
//============================================
set indexI = 0
set indexIC = 0
set metaI = 0
set metaIC = 0
set rootString = ""
set name = ""
set str = ""
set fieldString = ""
set prefix = ""
set processingIndex = false
//================
set dT_trackingData = null
set dT_i = 0
set dT_targetLocString = ""
set dT_iString = ""
set dT_prefix = ""
set dT_iC = 0
//================
set targetLocStringIC = 0
set dT_fieldI = 0
set dT_fieldIString = ""
set dT_fieldIC = 0
set dT_fieldMetaI = 0
set dT_fieldMetaIC = 0
set dT_fieldMetaIString = ""
set dT_fieldMetaNameString = ""
set targetLocStringMIC = 0
//================
set dT_rootName = ""
set dT_saveRootName = ""
set dT_name = ""
set dT_saveName = ""
set dT_addName = ""
set processFinished = false
set backstep = false
set hitLastEntry = false
set transfer = false
set deleteSL = 0
set i = 0
set iS = ""
set filterString = ""
set isIndexed = false
set forward = false
set entriesDeleted = 0
set debugInt = 0
set childKey = 0
set addName = ""
set dataType = ""
endfunction
function sAI_deleteDataTree takes string targetLocString, hashtable ht returns nothing
local integer indexI = 0
local integer indexIC = 0
local integer metaI = 0
local integer metaIC = 0
local string rootString = ""
local string name = ""
local string str = ""
local string fieldString = ""
local string prefix = ""
local boolean processingIndex = false
//================
local hashtable dT_trackingData = InitHashtableBJ()
local integer dT_i = 0
local string dT_targetLocString = ""
local string dT_iString = ""
local string dT_prefix = ""
local integer dT_iC = 0
//================
local integer targetLocStringIC = 0
local integer dT_fieldI = 0
local string dT_fieldIString = ""
local integer dT_fieldIC = 0
local integer dT_fieldMetaI = 0
local integer dT_fieldMetaIC = 0
local string dT_fieldMetaIString = ""
local string dT_fieldMetaNameString = ""
local integer targetLocStringMIC = 0
//================
local string dT_rootName = ""
local string dT_saveRootName = ""
local string dT_name = ""
local string dT_saveName = ""
local string dT_addName = ""
local boolean processFinished = false
local boolean backstep = false
local boolean hitLastEntry = false
local boolean transfer = false
local integer deleteSL = 0
local integer i = 0
local string iS = ""
local string filterString = ""
local boolean isIndexed = false
local boolean forward = false
local integer entriesAdded = 0
local integer debugInt = 0
local integer childKey = 0
//============================================
//MAIN PART
//============================================
//=====================================
//=====================================
set processFinished = false
//=====================================
set dT_saveRootName = targetLocString
//set prefix = dataLocString
set dT_rootName = LoadStringBJ(0, S2I(lv_dT_targetLocString + "_rootDir"), ht)
set dT_targetLocString = targetLocString
//==========================================
//==========================================
//==========================================
//==========================================
set deleteSL = StringLength(deletePrefix)
//MAIN FUNCTION
// a lot of this can't be necessary, we just need to delete, not transfer
loop
exitwhen (processFinished == true)
set dT_fieldIC = LoadIntegerBJ( 0, S2I(lv_dT_targetLocString + "_indexCount"), ht)
set dT_fieldMetaIC = LoadIntegerBJ( 0, S2I(lv_dT_targetLocString + "_metaList_indexCount"), ht)
set dT_fieldI = LoadIntegerBJ( 0, S2I(lv_dT_targetLocString + "_currentIndex"), dT_trackingData)
set dT_fieldMetaI = LoadIntegerBJ( 0, S2I(lv_dT_targetLocString + "_currentMetaIndex"), dT_trackingData)
// ACTUAL TRANSFER PROCESS
//deleting all the save names, cos it's not a transfer
if (dT_targetLocString == targetLocString) then
elseif (LoadBooleanBJ(0, S2I(dT_targetLocString + "_transferred"), dT_trackingData) != True) then
SaveBooleanBJ(true, 0, S2I( dT_targetLocString + "_transferred"), dT_trackingData)
//==========================================
//==========================================
//==========================================
//==========================================
//==========================================
//==========================================
//==========================================
//ACTUAL PROCESS
//DELETE DATA HERE
//make sure that if we're doing a meta, then the fieldI is actually 0, not sure if currentIndex automatically sets to 0
set childKey = fieldI //
if ( HaveSavedValue(childKey, bj_HASHTABLE_BOOLEAN, S2I(dT_targetLocString), ht) == true ) then
endif
if ( HaveSavedValue(childKey, bj_HASHTABLE_INTEGER, S2I(dT_targetLocString), ht) == true ) then
endif
if ( HaveSavedValue(childKey, bj_HASHTABLE_REAL, S2I(dT_targetLocString), ht) == true ) then
endif
if ( HaveSavedValue(childKey, bj_HASHTABLE_STRING, S2I(dT_targetLocString), ht) == true ) then
endif
if ( HaveSavedValue(childKey, bj_HASHTABLE_HANDLE, S2I(dT_targetLocString), ht) == true ) then
endif
call FlushChildHashtableBJ( S2I(dT_targetLocString), ht ) // might not need the previous type checks, flushing an entire index should be fine
//And delete all the in-built and all the meta, too.
//==========================================
//==========================================
//==========================================
//==========================================
//==========================================
//==========================================
//==========================================
//==========================================
set entriesDeleted = entriesDeleted + 1
else
set backstep = False
endif
//ITERATION
if ( ( (LoadIntegerBJ(0, S2I(lv_dT_targetLocString + "_indexCount"), ht) == 0) and (LoadIntegerBJ(0, S2I(lv_dT_targetLocString + "_metaList_indexCount"), ht) == 0) ) or ((dT_fieldI >= dT_fieldIC) and (dT_fieldMetaI >= dT_fieldMetaIC)) ) then
set backstep = True
else
set dT_rootName = lv_dT_targetLocString
if (dT_fieldI < dT_fieldIC) then
set dT_fieldI = dT_fieldI + 1
set dT_fieldIString = (String(dT_fieldI))
set dT_addName = dT_fieldIString
else
if (dT_fieldMetaI < dT_fieldMetaIC) then
set dT_fieldMetaI = dT_fieldMetaI + 1
set dT_fieldMetaIString = (I2S(dT_fieldMetaI))
set dT_addName = LoadStringBJ(0, S2I(lv_dT_targetLocString + "_metaList_" + lv_dT_fieldMetaIString), ht)
else
set dT_fieldMetaIString = (I2S(dT_fieldMetaI))
set dT_addName = LoadStringBJ(0, S2I(lv_dT_targetLocString + "_metaList_" + lv_dT_fieldMetaIString), ht)
endif
endif
endif
call SaveIntegerBJ(dT_fieldI, 0, S2I(lv_dT_targetLocString + "_currentIndex"), dT_trackingData)
call SaveIntegerBJ(dT_fieldMetaI, 0, S2I(lv_dT_targetLocString + "_currentMetaIndex"), dT_trackingData)
//==================================
//==================================
//TRACKING - FORWARD OR BACKWARDS
//==================================
//==================================
if (((dT_targetLocString == "") or ( dT_targetLocString == targetLocString)) and (backstep == true)) then
set processFinished = True
elseif (debugInt > 100) then
set processFinished = True
else
set debugInt = debugInt + 1
endif
//=====================================
//=====================================
//=====================================
if (backstep == True) then
set dT_targetLocString = LoadStringBJ(0, S2I(lv_dT_targetLocString + "_rootDir"), ht)
else
set dT_targetLocString = lv_dT_rootName + "_" + lv_dT_addName
endif
call FlushParentHashtableBJ(dT_trackingData)
//============================================
//PLUG LEAKS
//============================================
endfunction
//=======================================================================================
//=======================================================================================
//=======================================================================================
//=======================================================================================
//=======================================================================================
//=======================================================================================
function sAI_unitDetectUnits takes unit u, real r returns nothing
local real radius = 900
local integer i = GetHandleIdBJ(u)
local string unitIDString = I2S(i)
local integer dls_i = 0
local hashtable ht = udg_UnitAI
local group sortGroup = GetUnitsInRangeOfLocAll(200.00, GetUnitLoc(u))
local unit enumUnit = null
local integer num = 0
//MAIN PART
// add a condition for visibility, set rad to unit sight range
set enumUnit = FirstOfGroup(sortGroup)
loop
exitwhen (enumUnit == null)
if (IsPlayerEnemy(GetOwningPlayer(enumUnit), (GetOwningPlayer(u))) == true) then
if (IsUnitType(enumUnit, UNIT_TYPE_STRUCTURE) == false ) then
set num = num + 1
endif
endif
call GroupRemoveUnitSimple(enumUnit, sortGroup)
set enumUnit = FirstOfGroup(sortGroup)
endloop
set dls_i = S2I("Units_" + unitIDString + "_detectedUnits_count")
call SaveIntegerBJ(num, 0, dls_i, ht)
//PLUG LEAKS
set u = null
set i = 0
set unitIDString = ""
set dls_i = 0
set ht = null
set radius = 0
call DestroyGroup(sortGroup)
set enumUnit = null
set num = 0
endfunction
function sAI_Condition_timeElapsed takes real lp_time returns nothing
// just takes current game time, checks the difference, and returns if yea
endfunction
struct sAI_keys
private string name
private string parent
endstruct
function sAI_decompileSentenceToList takes string lp_nameString, string lp_parentString, string lp_string, hashtable lp_h returns nothing
local integer lv_indexCount = 0 // number of words
local integer lv_currentIndex = 1
local string lv_indexCountString = ""
local integer lv_parentKey = StringHashBJ(lp_parentString)
local integer lv_nameKey = StringHashBJ(lp_nameString)
local integer lv_wordStart = 0
local integer lv_wordEnd = 0
local integer lv_charPos = 0
local string lv_char = ""
local integer lv_numOfChars = 0
local string lv_obtainedWord = ""
local boolean lv_newWordAlreadyStarted = false
local boolean lv_startNewWord = false
local boolean lv_processFinished = false
//========================================================
//detect new word
set lv_numOfChars = StringLength(lp_string)
loop
exitwhen lv_processFinished == true
set lv_char = SubStringBJ(lp_string, lv_charPos, lv_charPos)
if lv_newWordAlreadyStarted then
if lv_char == " " then
set lv_startNewWord = true
set lv_wordEnd = lv_charPos - 1
elseif lv_char == "," then
set lv_startNewWord = true
set lv_wordEnd = lv_charPos - 1
elseif lv_charPos == lv_numOfChars then
set lv_startNewWord = true
elseif lv_charPos > lv_numOfChars then
set lv_startNewWord = false
set lv_processFinished = true
else
set lv_startNewWord = false
endif
else
if lv_char == " " then
elseif lv_char == "," then
elseif lv_charPos > lv_numOfChars then
set lv_startNewWord = false
set lv_processFinished = true
else
set lv_wordStart = lv_charPos
set lv_startNewWord = true
endif
endif
if lv_startNewWord == true then
set lv_obtainedWord = SubStringBJ(lp_string, lv_wordStart, lv_wordEnd)
set lv_startNewWord = false
set lv_newWordAlreadyStarted = false
call sAI_addStringParameterToHash(lp_nameString, lp_parentString, "", lv_obtainedWord, lp_h)
endif
set lv_charPos = lv_charPos + 1
endloop
endfunction
function sAI_addKnowledgeForTerm takes integer lp_playerID, string lp_term, string lp_knowledge returns nothing
call sAI_addStringParameterToHash("", "PlayerAI_Terms", lp_term, lp_knowledge, udg_PlayerAI[lp_playerID])
call sAI_decompileSentenceToList(lp_term, "PlayerAI_Terms", lp_knowledge, udg_PlayerAI[lp_playerID])
endfunction
function sAI_addKnowledgeToIndex takes integer lp_playerID, string lp_knowledge returns nothing // maybe decompiles to word headers but i think index works fine
local string lv_indexCountString = LoadStringBJ(StringHashBJ("indexCount"),StringHashBJ("PlayerAI_Terms"), udg_PlayerAI[lp_playerID])
local integer lv_indexCount = S2I(lv_indexCountString)
call sAI_addStringParameterToHash("", "PlayerAI_Terms_" + lv_indexCountString, "", lp_knowledge, udg_PlayerAI[lp_playerID])
call sAI_decompileSentenceToList("", "PlayerAI_Terms_" + lv_indexCountString, lp_knowledge, udg_PlayerAI[lp_playerID])
endfunction
function sAI_unitPerformOrder takes string lp_nameString, string lp_parentString, unit lp_unit returns nothing
local integer lv_unitID = GetHandleIdBJ(lp_unit)
local string lv_unitIDString = I2S(lv_unitID)
local integer lv_playerID = GetConvertedPlayerId(GetOwningPlayer(lp_unit))
local integer lv_indexCount = 0
local integer lv_hashParentInt = 0
local integer lv_hashNameInt = 0
local string lv_parentString = ""
local string lv_stringPrefix = ""
local string lv_orderString = ""
local boolean lv_orderExists = false
local hashtable lv_orderHash = InitHashtable()
local hashtable lv_missingTerms = InitHashtable()
local widget lv_getTarget = null
local handle lv_handle = null
local integer lv_order = 0
local boolean lv_orderCanBePerformed = true
local integer i = 1
//======
local string lv_findTerm = ""
local string lv_termString = ""
local integer lv_widgetID = 0
local integer i2 = 0
local integer lv_evalIndexCount = 0
set lv_orderString = ""
//======================
// Add a few requisite search terms for this prefab.
//======================
// need to add some context stuff for this
set lv_findTerm = "order"
call sAI_addStringParameterToHash("", "findTerm", "", lv_findTerm, lv_orderHash)
set lv_findTerm = "target"
call sAI_addStringParameterToHash("", "findTerm", "", lv_findTerm, lv_orderHash)
set lv_indexCount = LoadIntegerBJ(StringHashBJ("indexCount"), StringHashBJ("findTerm"), lv_orderHash)
loop
exitwhen i > lv_indexCount
set lv_findTerm = LoadStringBJ(StringHashBJ(I2S(i)), StringHashBJ("findTerm"), lv_orderHash)
if LoadStringBJ(StringHashBJ(lp_nameString + "_metaList_" + lv_findTerm), StringHashBJ(lp_parentString), udg_unitAI) != "" then
// add indexMetaList search here to get the indexes too unless you just wanna loop for it which might be more efficient anyway
set lv_orderString = LoadStringBJ(StringHashBJ(lp_nameString + lv_findTerm), StringHashBJ(lp_parentString), udg_unitAI)
if lv_findTerm == "order" then
set lv_orderString = LoadStringBJ(StringHashBJ(lp_nameString + lv_findTerm), StringHashBJ(lp_parentString), udg_unitAI)
elseif lv_findTerm == "target" then // get it to find an id from it
set lv_getTarget = LoadWidgetHandleBJ(StringHashBJ(lp_nameString + lv_findTerm), StringHashBJ(lp_parentString), udg_unitAI)
// this might need to be replaced with a context find function, unless missingTerms does that
else
endif
else
endif
set i = i + 1
endloop
loop
exitwhen i2 > lv_evalIndexCount
set lv_termString = LoadStringBJ(StringHashBJ(lp_nameString + "_metaList_" + I2S(i2)), StringHashBJ(lp_parentString), udg_unitAI)
set lv_termString = LoadStringBJ(StringHashBJ(lv_termString), StringHashBJ(lp_parentString), udg_unitAI)
if lv_orderString == "" then
if sAI_playerTermsConnectedImmediate(lv_playerID, "order", lv_termString) then
if sAI_playerTermsConnectedImmediate(lv_playerID, "unit", lv_termString) then
set lv_orderString = LoadStringBJ(StringHashBJ(lv_termString), StringHashBJ(lp_parentString), udg_unitAI)
endif
endif
endif
//===========================
//more checking
//set lv_evalNameString = ""
if lv_getTarget == null then
if sAI_playerTermsConnectedImmediate(lv_playerID, "target", lv_termString) then
set lv_getTarget = LoadUnitHandleBJ(StringHashBJ(lv_termString), StringHashBJ(lp_parentString), udg_unitAI) // I think this is how i do units
endif
endif
set i2 = i2 + 1
endloop
// can do find missing terms here if i want, get it all out of the way, and do that quick search
if lv_getTarget == null then
call sAI_addWordToParentKeyString(lv_parentString, lp_parentString, "missingTerm")
call sAI_addStringParameterToHash(lp_nameString, lv_parentString, "", "order", udg_unitAI)
endif
if lv_orderString == "" then
set lv_orderCanBePerformed = false
call sAI_addWordToParentKeyString(lv_parentString, lp_parentString, "missingTerm")
call sAI_addStringParameterToHash(lp_nameString, lv_parentString, "", "target", udg_unitAI)
endif
if lv_orderCanBePerformed == true then
if lv_getTarget != null then
call IssueTargetOrderById(lp_unit, String2OrderIdBJ(lv_orderString), lv_getTarget) // since this just needs a widget, what more context dya need?
// probably should do by string? does it make a difference?
else
call IssueImmediateOrderById(lp_unit, StringHashBJ(lv_orderString))
endif
endif
//===========================================
// CLEAN UP LEAKS
//===========================================
set lv_orderHash = null // does this eliminate leaks?
set lv_missingTerms = null // i don't think i need this
set lv_unitID = 0
set lv_unitIDString = ""
set lv_indexCount = 0
set lv_hashParentInt = 0
set lv_hashNameInt = 0
set lv_parentString = ""
set lv_stringPrefix = ""
set lv_orderString = ""
set lv_orderExists = false
set lv_getTarget = null
set lv_order = 0
set lv_orderCanBePerformed = false
set i = 0
endfunction
function sAI_unitPerformAllOrders takes unit lp_unit returns nothing
local integer lv_unitID = GetHandleIdBJ(lp_unit)
local string lv_unitIDString = I2S(lv_unitID)
local integer lv_playerID = GetConvertedPlayerId(GetOwningPlayer(lp_unit))
local integer lv_indexCount = 0
local string lv_indexCountString = ""
local integer lv_hashParentInt = 0
local integer lv_hashNameInt = 0
local string lv_parentString = ""
local string lv_stringPrefix = ""
local string lv_orderString = ""
local boolean lv_orderExists = false
local hashtable lv_orderHash = InitHashtable()
local hashtable lv_missingTerms = InitHashtable()
local widget lv_getTarget = null
local handle lv_handle = null
local integer lv_order = 0
local boolean lv_orderCanBePerformed = true
local integer i = 1
local integer lv_currentIndex = 1
local string lv_currentIndexString = ""
//======
local string lv_nameStringA = ""
//================================
set lv_orderString = ""
set lv_indexCountString = LoadStringBJ(StringHashBJ("indexCount"),StringHashBJ("Units_" + lv_unitIDString + "_Orders"), udg_unitAI)
set lv_indexCount = S2I(lv_indexCountString)
loop
exitwhen lv_currentIndex > lv_indexCount
set lv_currentIndexString = I2S(lv_currentIndex)
call sAI_unitPerformOrder(lv_currentIndexString, "Units_" + lv_unitIDString + "_Orders", lp_unit)
set lv_currentIndex = lv_currentIndex + 1
endloop
//===========================================
// CLEAN UP LEAKS
//===========================================
set lv_orderHash = null // does this eliminate leaks?
set lv_missingTerms = null // i don't think i need this
set lv_unitID = 0
set lv_unitIDString = ""
set lv_indexCount = 0
set lv_hashParentInt = 0
set lv_hashNameInt = 0
set lv_parentString = ""
set lv_stringPrefix = ""
set lv_orderString = ""
set lv_orderExists = false
set lv_getTarget = null
set lv_order = 0
set lv_orderCanBePerformed = false
set i = 0
endfunction
function sAI_getDataType takes string lp_nameString, string lp_parentString, hashtable lp_h returns string
local string lv_parentString = ""
if HaveSavedValue(StringHashBJ(lp_nameString), bj_HASHTABLE_HANDLE, StringHashBJ(lp_parentString), lp_h) == true then
if LoadUnitHandleBJ(StringHashBJ(lp_nameString), StringHashBJ(lp_parentString), lp_h) != null then
return "unit"
elseif LoadDestructableHandleBJ(StringHashBJ(lp_nameString), StringHashBJ(lp_parentString), lp_h) != null then
return "destructible"
else
return "unknownHandle"
endif
elseif HaveSavedValue(StringHashBJ(lp_nameString), bj_HASHTABLE_STRING, StringHashBJ(lp_parentString), lp_h) == true then
return "string"
else
endif
//OR
call sAI_addWordToParentKeyString(lv_parentString, lp_parentString, "dataType")
return LoadStringBJ(StringHashBJ(lp_nameString), StringHashBJ(lp_parentString), lp_h)
return ""
endfunction
function sAI_hasSavedData takes string lp_nameString, string lp_parentString, hashtable lp_h returns boolean
local integer nameKey = S2I(lp_nameString)
local integer parentKey = S2I(lp_parentString)
if (HaveSavedValue(nameKey, bj_HASHTABLE_HANDLE, parentKey, lp_h) == true ) then
return true
endif
if (HaveSavedValue(nameKey, bj_HASHTABLE_STRING, parentKey, lp_h) == true ) then
return true
endif
if (HaveSavedValue(nameKey, bj_HASHTABLE_INTEGER, parentKey, lp_h) == true ) then
return true
endif
if (HaveSavedValue(nameKey, bj_HASHTABLE_REAL, parentKey, lp_h) == true ) then
return true
endif
if (HaveSavedValue(nameKey, bj_HASHTABLE_BOOLEAN, parentKey, lp_h) == true ) then
return true
endif
return false
endfunction
function sAI_evaluateMissingAllMissingTerms takes integer lp_playerID, string lp_nameString, string lp_parentString, hashtable lp_h returns nothing
local string lv_term = ""
local string lv_termNameString = ""
local string lv_termParentString = ""
local integer aiResources = 1000
local string lv_nameString = ""
local string lv_parentString = ""
local string lv_missingDataType = ""
local integer lv_missingDataTypeIndexCount = 0
local integer lv_missingDataTypeIndex = 0
local string lv_missingDataTypeIndexCountString = ""
local string lv_missingDataTypeIndexString = ""
local string lv_missingTerm = ""
local integer lv_missingTermIndexCount = 0
local integer lv_missingTermIndex = 0
local string lv_missingTermIndexCountString = ""
local string lv_missingTermIndexString = ""
local hashtable lv_searchHash = InitHashtable()
local string lv_searchTerm = ""
local integer lv_searchTermIndexCount = 0
local integer lv_searchTermIndex = 0
local string lv_searchTermIndexCountString = ""
local string lv_searchTermIndexString = ""
local string lv_listTerm = ""
local integer lv_listIndexCount = 0
local integer lv_listIndex = 0
local string lv_listIndexCountString = ""
local string lv_listIndexString = ""
local unit lv_evalUnit = null
local integer lv_evalInt = 0
local string lv_evalString = ""
local integer lv_numOfMatches = 0
local integer lv_connectionDistance = 0
local boolean lv_processFinished = false
local integer i = 1
//==========================================================================
//==========================================================================
// this will have to be updated to allow multiple, i.e. getting a missing target unit, and also a missing other unit of some type, etc
// maybe just some automatic context added to the auto-prompt, where those context clues are set in deprecation
//==========================================================================
// ADD MISSING TERMS TO SEARCH HASH (as a likely place to start search)
//==========================================================================
loop
exitwhen lv_missingTermIndex > lv_missingTermIndexCount
call sAI_addWordToParentKeyString(lv_parentString, lv_parentString, "missingTerm_" + I2S(lv_missingTermIndex))
set lv_term = LoadStringBJ(StringHashBJ(lp_nameString), StringHashBJ(lv_parentString), lp_h) // missingTerm
call sAI_addStringParameterToHash("", "searchTerms", "", lv_term, lv_searchHash) // adds 1_ style
set lv_missingTermIndex = lv_missingTermIndex + 1
endloop
set lv_missingTermIndex = 1
//==========================================================================
//==========================================================================
set lv_missingDataType = LoadStringBJ(StringHashBJ(lp_nameString), StringHashBJ(lp_parentString + "_missingTerms_" + lv_missingTermIndexString + "_dataType"), lp_h)
set lv_missingDataTypeIndex = 1
// Just to start this off.
//==========================================================================
// MAIN FUNCTION
//==========================================================================
loop
exitwhen lv_processFinished == true
call sAI_addWordToParentKeyString(lv_parentString, lp_parentString, "missingDataType_indexCount")
set lv_missingDataTypeIndexCount = S2I(LoadStringBJ(StringHashBJ(lp_nameString), StringHashBJ(lv_parentString), lp_h))
//=============================
//=============================
loop
exitwhen i > lv_missingDataTypeIndexCount
call sAI_addWordToParentKeyString(lv_parentString, lp_parentString, "missingDataType")
call sAI_addWordToParentKeyString(lv_parentString, lp_parentString, I2S(i))
if sAI_hasSavedData(lv_nameString, lv_parentString, lp_h) == true then
set lv_missingDataTypeIndex = lv_missingDataTypeIndex + 1
endif
set i = i + 1
endloop
set i = 1
//=============================
//=============================
// This is sort of the centred bit, as it will be iterated by loop methink
set lv_missingDataTypeIndexString = I2S(lv_missingDataTypeIndex)
set lv_missingDataType = LoadStringBJ(StringHashBJ(lp_nameString), StringHashBJ(lp_parentString + "_missingDataType_" + lv_missingDataTypeIndexString), lp_h)
call sAI_addWordToParentKeyString(lv_parentString, lv_parentString, "searchTerm_" + I2S(lv_searchTermIndex))
set lv_searchTerm = LoadStringBJ(StringHashBJ(lv_nameString), StringHashBJ(lv_parentString), lv_searchHash) // missingTerm
//=============================
//=============================
set i = 1
loop
exitwhen i > lv_missingTermIndexCount
call sAI_addWordToParentKeyString(lv_parentString, lp_parentString, "missingTerm")
call sAI_addWordToParentKeyString(lv_parentString, lp_parentString, I2S(i))
set lv_missingTerm = LoadStringBJ(StringHashBJ(lp_nameString), StringHashBJ(lv_parentString), lp_h)
if sAI_playerTermsConnectedImmediate(lp_playerID, lv_searchTerm, lv_missingTerm) then
set lv_numOfMatches = lv_numOfMatches + 1
endif
// this sees how much the context matches
set i = i + 1
endloop
set i = 1
// best number of matches, etc - this probably operates just in a deprecated fashion, until more complexity added
//=============================
//=============================
set lv_termParentString = "PlayerAI_Terms"
call sAI_addWordToKeyStrings(lv_nameString, lv_parentString, lv_termNameString, lv_termParentString, lv_searchTerm)
call sAI_addWordToParentKeyString(lv_parentString, lv_parentString, "indexCount")
set lv_listIndexCount = S2I(LoadStringBJ(StringHashBJ(lv_nameString), StringHashBJ(lv_parentString), udg_PlayerAI[lp_playerID]))
set lv_listIndex = 1
loop
exitwhen i > lv_listIndexCount
set lv_listIndexString = I2S(lv_listIndex)
call sAI_addWordToKeyStrings(lv_nameString, lv_parentString, lv_termNameString, lv_termParentString, lv_searchTerm) // required for total key
call sAI_addWordToParentKeyString(lv_parentString, lv_termParentString, lv_listIndexString)
set lv_term = LoadStringBJ(StringHashBJ(lv_nameString), StringHashBJ(lv_parentString), udg_PlayerAI[lp_playerID])
call sAI_addStringParameterToHash("", "searchTerms", "", lv_term, lv_searchHash) // adds each list member to the search parameters
// not sure how this works with index vs word
// i tihnk it might be irrelevant, term words all just list words
// there's no deprecation or whatever
set lv_searchTermIndexCount = lv_searchTermIndexCount + 1
if sAI_getDataType(lv_nameString, lv_parentString, udg_PlayerAI[lp_playerID]) == lv_missingDataType then
//=======================================
//SAVE ENTRY FOR MISSING DATA TYPE, WOO
//=======================================
call sAI_addWordToParentKeyString(lv_parentString, lp_parentString, lv_missingDataType)
if lv_missingDataType == "unit" then
set lv_evalUnit = LoadUnitHandleBJ(StringHashBJ(lv_nameString), StringHashBJ(lv_parentString), udg_PlayerAI[lp_playerID])
call SaveUnitHandleBJ(lv_evalUnit, StringHashBJ(lv_nameString), StringHashBJ(lv_parentString), lp_h)
endif
if lv_missingDataType == "order" then
set lv_evalInt = LoadIntegerBJ(StringHashBJ(lv_nameString), StringHashBJ(lv_parentString), udg_PlayerAI[lp_playerID])
call SaveIntegerBJ(lv_evalInt, StringHashBJ(lv_nameString), StringHashBJ(lv_parentString), lp_h)
endif
if lv_missingDataType == "orderString" then
set lv_evalString = LoadStringBJ(StringHashBJ(lv_nameString), StringHashBJ(lv_parentString), udg_PlayerAI[lp_playerID])
call SaveStringBJ(lv_evalString, StringHashBJ(lv_nameString), StringHashBJ(lv_parentString), lp_h)
endif
if lv_missingDataType == "string" then
set lv_evalString = LoadStringBJ(StringHashBJ(lv_nameString), StringHashBJ(lv_parentString), udg_PlayerAI[lp_playerID])
call SaveStringBJ(lv_evalString, StringHashBJ(lv_nameString), StringHashBJ(lv_parentString), lp_h)
endif
set lv_missingDataTypeIndex = lv_missingDataTypeIndex + 1
set aiResources = 1000 // or it'll pick up where it left off next time instead
call FlushParentHashtableBJ( lv_searchHash )
//====================================================
//====================================================
// reset the SearchHash table, might as well put it here
//====================================================
//====================================================
loop
exitwhen lv_missingTermIndex > lv_missingTermIndexCount
call sAI_addWordToParentKeyString(lv_parentString, lv_parentString, "missingTerm_" + I2S(lv_missingTermIndex))
set lv_term = LoadStringBJ(StringHashBJ(lp_nameString), StringHashBJ(lv_parentString), lp_h) // missingTerm
call sAI_addStringParameterToHash("", "searchTerms", "", lv_term, lv_searchHash) // adds 1_ style
set lv_missingTermIndex = lv_missingTermIndex + 1
endloop
set lv_missingTermIndex = 1
endif
endloop
set lv_searchTermIndex = lv_searchTermIndex + 1
set lv_connectionDistance = lv_connectionDistance + 1
set aiResources = aiResources - 1
if lv_searchTermIndex > lv_searchTermIndexCount then
set lv_searchTermIndex = 1
set lv_missingDataTypeIndex = lv_missingDataTypeIndex + 1 // have it fill as much as it can
endif
if aiResources == 0 then
set lv_processFinished = true
endif
if lv_missingDataTypeIndex > lv_missingDataTypeIndexCount then
set lv_processFinished = true
endif
endloop
// saves back into the MissingTerms to be picked up by the Order next turn
endfunction
function sAI_evaluateOrders takes unit lp_unit returns nothing
local integer lv_hashLocInt = 0 //gets the location of the order
local integer lv_unitID = GetHandleIdBJ(lp_unit)
local string lv_unitIDString = I2S(lv_unitID)
local integer lv_indexCount = 0
local integer lv_ordersIndexCount = 0
local integer lv_hashParentInt = 0
local integer lv_hashNameInt = 0
local string lv_parentString = ""
local string lv_stringPrefix = ""
local hashtable lv_missingTerms = null
local string lv_missingTermsRootNameS = ""
local string lv_missingTermsNameS = ""
local integer lv_termIndex = 0
local string lv_termIndexString = ""
local string lv_missingTerm = ""
local integer lv_missingTermsIndexCount = 0
local string lv_orderPath = ""
set lv_ordersIndexCount = LoadIntegerBJ(StringHashBJ("Units_" + lv_unitIDString + "_Orders"), StringHashBJ("indexCount"), udg_unitAI)
loop
exitwhen i > lv_ordersIndexCount
set lv_orderNameString = StringHashBJ(I2S(i))
set lv_missingTermsRootNameS = lv_orderNameString + "_missingTerms"
set lv_missingTermsIndexCount = LoadIntegerBJ(StringHashBJ("Units_" + lv_unitIDString + "_Orders"), StringHashBJ(lv_missingTermsRootNameS + "_indexCount"), udg_unitAI)
// presumably they're just added by index, but if this needs to account for meta/index i can do it later
loop
exitwhen lv_termIndex > lv_missingTermsIndexCount
set lv_termIndexString = I2S(lv_termIndex)
set lv_missingTerm = LoadStringBJ(StringHashBJ("Units_" + lv_unitIDString + "_Orders"), StringHashBJ(lv_missingTermsRootNameS + "_" + lv_termIndexString), udg_unitAI)
set lv_termIndex = lv_termIndex +1
endloop
set i = i + 1
endloop
endfunction
function sAI_createHashIDForUnit takes unit lp_unit returns nothing
local integer lv_unitID = GetHandleIdBJ(lp_unit)
local string lv_unitIDString = I2S(lv_unitID)
local string lv_unitName = GetUnitName(lp_unit)
local string lv_rootNameString = ""
local string lv_rootParentString = "Units_" + lv_unitIDString
local string lv_nameString = ""
local string lv_parentString = ""
call sAI_saveStringParameterToHash(lv_nameString, lv_parentString, "unitName", lv_unitName, udg_unitAI)
call sAI_saveUnitParameterToHash(lv_nameString, lv_parentString, "unit", lp_unit, udg_unitAI)
endfunction
function sAI_addPlayerKnowledgeSet1 takes integer lp_playerID returns nothing
local integer lv_indexCount = 0
local integer lv_hashParentInt = 0
local integer lv_hashNameInt = 0
local string lv_parentString = ""
local string lv_stringPrefix = ""
call sAI_addKnowledgeForTerm(lp_playerID, "gold", "gold mine, harvest")
call sAI_addKnowledgeForTerm(lp_playerID, "gold mine", "gold")
call sAI_addKnowledgeForTerm(lp_playerID, "lumber", "tree, wood, harvest, resources")
call sAI_addKnowledgeForTerm(lp_playerID, "order", "move, stop, attack, patrol, hold, harvest")
call sAI_addKnowledgeForTerm(lp_playerID, "harvest", "order")
call sAI_addKnowledgeForTerm(lp_playerID, "get location", "X, Y")
// oddly this is a sentence as a term, which i guess could be possible but might be tricky
// giving it some guidance on how to read co-ordinates
endfunction
function sAI_addGoldMinesToPlayerKnowledge takes nothing returns nothing
local integer lv_hashLocInt = 0 //the place where the info gets saved, converted from string
local integer lv_unitID = 0 //GetHandleIdBJ(lp_unit)
local string lv_unitIDString = "" //I2S(lv_unitID)
local hashtable lv_h = null
local integer lv_indexCount = 0
local integer lv_hashParentInt = 0
local integer lv_hashNameInt = 0
local string lv_parentString = ""
local string lv_stringPreFix = ""
local integer lv_playerID = 0
local boolean lv_playerAIActive = false
local group lv_goldMines = null
local group lv_evalGroup = null
local unit lv_evalUnit = null
local integer i = 0
local integer lv_evalUnitID = 0
local string lv_evalUnitIDString = ""
local string lv_savedNameString = ""
local string xString = ""
local string yString = ""
// saves the sentence and ALSO decompiles to seperate words? the way the location string was decompiled? (why? why not for now i guess, just means the ai will do it
//instead of me)
set lv_evalGroup = GetUnitsInRectAll(GetPlayableMapRect())
set lv_evalUnit = FirstOfGroup(lv_evalGroup)
set lv_evalUnitID = GetHandleIdBJ(lv_evalUnit)
set lv_evalUnitIDString = I2S(lv_evalUnitID)
loop
exitwhen lv_evalUnit == null
//======================================================================================================
set i = 0
if GetUnitTypeId(lv_evalUnit) == 'ngol' then
loop
exitwhen i > 15
set lv_h = udg_PlayerAI[i]
set lv_playerAIActive = LoadBooleanBJ(StringHashBJ("playerAIActive"), StringHashBJ("PlayerAI"), lv_h)
set xString = I2S(R2I(GetUnitX(lv_evalUnit)))
set yString = I2S(R2I(GetUnitY(lv_evalUnit)))
call sAI_addKnowledgeForTerm(i, "gold mine", "unitIDString" )
call sAI_addKnowledgeForTerm(i, "gold mine", "location, X " + xString + ", Y " + yString ) // just to make it easier to write
call sAI_addKnowledgeForTerm(i, "location", "X, Y")
call sAI_addKnowledgeForTerm(i, "gold mine " + lv_evalUnitIDString + " location x", xString) // is this a way to do it? or too big?
// i think that's the way
set i = i + 1
endloop
endif
set i = 0
call GroupRemoveUnit(lv_evalGroup, lv_evalUnit)
set lv_evalUnit = FirstOfGroup(lv_evalGroup)
endloop
endfunction
function write_sAI_TermsForAll takes nothing returns nothing
local string term = ""
local string stringData = ""
local string fieldState = "locked"
local boolean writeDataToAll = false // this will mean that it takes all the entered words and creates entries for them too, if true
// if the terms are created into new entries using the sentence, the sentence should just have a single handle, so no mem loss
// and all the individual words that are associated will also have the same handle ids (although i dunno what the overhead on a handle is)
// so it saves on that mem requirement anyway
// in theory, to save more, it would just link a shared sentence with the decompiled words, using that sentence as a term
// and that may be exactly how i do it... later (handles are great)
// although we have to take into account how each term can have a unique relationship with other words, that's why they're different words
// still, if you need a quick link to an example sentence, this might be how that's done (again, depending on how the demands roll out)
local integer lv_playerID = 0
loop
exitwhen lv_playerID > 16
set term = "kill"
set stringData = "destroy, eliminate, kill, murder, slay, remove"
call sAI_addKnowledgeForTerm(lv_playerID, term, stringData)
set term = "building"
set stringData = "structure, construction, house, farm, barracks, town hall, tower"
call sAI_addKnowledgeForTerm(lv_playerID, term, stringData)
set term = "base"
set stringData = "buildings, unit producing structures, military camp, economy centre, military centre, where the heroes are summoned"
call sAI_addKnowledgeForTerm(lv_playerID, term, stringData)
set term = "where"
set stringData = "location"
call sAI_addKnowledgeForTerm(lv_playerID, term, stringData)
set term = "unit"
set stringData = "soldier, footman, person, warrior, peasant, worker, building, town hall, Prince Kael, Saira, Herodin, Alucard"
call sAI_addKnowledgeForTerm(lv_playerID, term, stringData)
set term = "villain"
set stringData = "bad guy, enemy, opponent, rival, Alucard, demons, evil, wrong-doers, lawbreakers, bandits, undead, someone who needs to be killed or converted to good"
call sAI_addKnowledgeForTerm(lv_playerID, term, stringData)
set term = "someone"
set stringData = "person, unit, guy"
call sAI_addKnowledgeForTerm(lv_playerID, term, stringData)
set term = "hero"
set stringData = "Prince Kael, Saira, Herodin, warrior, can be resurrected at altar, is classified as a hero"
call sAI_addKnowledgeForTerm(lv_playerID, term, stringData)
set term = "resurrection"
set stringData = "revive, bring back to life, make not dead, resummon at an altar structure"
call sAI_addKnowledgeForTerm(lv_playerID, term, stringData)
set term = "dwarves"
set stringData = "are awesome, are a race, short, bearded, use rifles, hide in barrels for ambush, good workers, excellent at gold mining and making funny jokes"
call sAI_addKnowledgeForTerm(lv_playerID, term, stringData)
set term = "build"
set stringData = "ability, construct buildings, make buildings, create buildings, create, make, construct, structures, builder"
call sAI_addKnowledgeForTerm(lv_playerID, term, stringData)
set term = "town hall"
set stringData = "building, economic centre, trains workers, return resources to, can be built by a peasant, main building of any town"
call sAI_addKnowledgeForTerm(lv_playerID, term, stringData)
set term = "yours"
set stringData = "mine, self, own, inverse" // needs to have a 'sense of direction' and such things for this type of thing - relationship "tenses'
call sAI_addKnowledgeForTerm(lv_playerID, term, stringData)
set lv_playerID = lv_playerID + 1
endloop
endfunction
function sAI_pfAddHarvestGoldOrder takes unit lp_unit returns nothing
local integer lv_unitID = GetHandleIdBJ(lp_unit)
local string lv_unitIDString = I2S(lv_unitID)
local string lv_rootParentString = "Units_" + lv_unitIDString +"_Orders"
local string lv_rootNameString = ""
local string lv_parentString = ""
local string lv_nameString = ""
local string lv_indexCountString = LoadStringBJ(StringHashBJ("indexCount"), StringHashBJ("Units_" + lv_unitIDString + "_Orders"), udg_unitAI) //indexCountString?
local integer lv_indexCount = S2I(lv_indexCountString)
call sAI_addWordToParentKeyString(lv_parentString, lv_rootParentString, lv_indexCountString)
call sAI_addWordToKeyStrings(lv_nameString, lv_parentString, lv_rootNameString, lv_parentString, "unit")
call sAI_saveUnitParameterToHash(lv_nameString, lv_parentString, "", lp_unit, udg_unitAI)
call sAI_decompileSentenceToList(lv_nameString, lv_parentString, "harvest gold", udg_unitAI)
endfunction
function sAI_pfAddHarvestLumberOrder takes unit lp_unit returns nothing
local integer lv_unitID = GetHandleIdBJ(lp_unit)
local string lv_unitIDString = I2S(lv_unitID)
local string lv_rootParentString = "Units_" + lv_unitIDString +"_Orders"
local string lv_rootNameString = ""
local string lv_parentString = ""
local string lv_nameString = ""
local string lv_indexCountString = LoadStringBJ(StringHashBJ("indexCount"), StringHashBJ("Units_" + lv_unitIDString + "_Orders"), udg_unitAI) //indexCountString?
local integer lv_indexCount = S2I(lv_indexCountString)
call sAI_addWordToParentKeyString(lv_parentString, lv_rootParentString, lv_indexCountString)
call sAI_addWordToKeyStrings(lv_nameString, lv_parentString, lv_rootNameString, lv_parentString, "unit")
call sAI_saveUnitParameterToHash(lv_nameString, lv_parentString, "", lp_unit, udg_unitAI)
call sAI_decompileSentenceToList(lv_nameString, lv_parentString, "harvest lumber", udg_unitAI)
// i do probably still want an add name parameter in there somewhere
endfunction
native GetUnitGoldCost takes integer unitid returns integer
native GetUnitWoodCost takes integer unitid returns integer
native GetUnitBuildTime takes integer unitid returns integer
function udf_playerCanAffordUnit takes integer unitid, integer p returns boolean
local integer goldCost = GetUnitGoldCost(unitid)
local integer lumberCost = GetUnitWoodCost(unitid)
local integer currentGold = GetPlayerState(Player(p), PLAYER_STATE_RESOURCE_GOLD)
local integer currentLumber = GetPlayerState(Player(p), PLAYER_STATE_RESOURCE_LUMBER)
local integer foodRemaining = (GetPlayerState(Player(p), PLAYER_STATE_RESOURCE_FOOD_CAP) - GetPlayerState(Player(p), PLAYER_STATE_RESOURCE_FOOD_USED))
local integer foodCost = GetFoodUsed(unitid)
if (goldCost < currentGold) and (lumberCost < currentLumber) and (foodCost < foodRemaining) then
return true
else
return false
endif
endfunction
//=====================================================================
// Finds the nearest Town Hall to unit
function udf_getClosestPlayerTHToPointFunction1 takes nothing returns nothing
local real lv_dist = 0
set lv_dist = DistanceBetweenPoints(GetUnitLoc(GetEnumUnit()), udg_tempLocation)
if lv_dist < udg_tempHighestReal then
set udg_tempHighestReal = lv_dist
set udg_tempUnit = GetEnumUnit()
endif
endfunction
function udf_getClosestPlayerTHToPointCondition1 takes nothing returns boolean
return ( IsUnitType(GetFilterUnit(), UNIT_TYPE_TOWNHALL) == true )
endfunction
function udf_getClosestPlayerTHToPoint takes location lp_p returns unit
set udg_tempLocation = lp_p
set udg_tempUnit = null
set udg_tempHighestReal = 1000.0 //Just to get the ball rolling.
call ForGroupBJ( GetUnitsInRectMatching(GetPlayableMapRect(), Condition(function udf_getClosestPlayerTHToPointCondition1)), function udf_getClosestPlayerTHToPointFunction1 )
set udg_tempLocation = null
set udg_tempHighestReal = 0.0
return udg_tempUnit
//presumably these functions call in a row, and temps won't conflict
endfunction
//=====================================================================
//=====================================================================
// Finds the nearest gold mine to loc
function udf_getClosestGoldMineToPointFunction1 takes nothing returns nothing
local real lv_dist = 0
set lv_dist = DistanceBetweenPoints(GetUnitLoc(GetEnumUnit()), udg_tempLocation)
if lv_dist < udg_tempHighestReal then
set udg_tempHighestReal = lv_dist
set udg_tempUnit = GetEnumUnit()
endif
endfunction
function udf_getClosestGoldMineToPointCondition1 takes nothing returns boolean
return (GetUnitTypeId(GetFilterUnit()) == 'ngol')
endfunction
function udf_getClosestGoldMineToPoint takes location lp_p returns unit
set udg_tempLocation = lp_p
set udg_tempUnit = null
set udg_tempHighestReal = 1000.0 //Just to get the ball rolling.
call ForGroupBJ( GetUnitsInRectMatching(GetPlayableMapRect(), Condition(function udf_getClosestGoldMineToPointCondition1)), function udf_getClosestGoldMineToPointFunction1 )
set udg_tempLocation = null
set udg_tempHighestReal = 0.0
return udg_tempUnit
//presumably these functions call in a row, and temps won't conflict
endfunction
//=====================================================================
//=====================================================================
function udf_getClosestUnitOfGroupToPointFunction1 takes nothing returns nothing
local real lv_dist = 0
set lv_dist = DistanceBetweenPoints(GetUnitLoc(GetEnumUnit()), udg_tempLocation)
if lv_dist < udg_tempHighestReal then
set udg_tempHighestReal = lv_dist
set udg_tempUnit = GetEnumUnit()
endif
endfunction
function udf_getClosestUnitOfGroupToPoint takes group lp_g, location lp_p returns unit
set udg_tempLocation = lp_p
set udg_tempUnit = null
set udg_tempHighestReal = 1000.0 //Just to get the ball rolling.
call ForGroupBJ( lp_g, function udf_getClosestUnitOfGroupToPointFunction1 )
set udg_tempLocation = null
set udg_tempHighestReal = 0.0
return udg_tempUnit
//presumably these functions call in a row, and temps won't conflict
endfunction
//=====================================================================
//=====================================================================
// Finds the nearest claimed Forest/Tree
//woops, need dest type as well
function udf_getClosestTreeToPointFunction1 takes nothing returns nothing
local real lv_dist = 0
set lv_dist = DistanceBetweenPoints(GetDestructableLoc(GetEnumDestructable()), udg_tempLocation)
if (lv_dist < udg_tempHighestReal) and (GetDestructableTypeId(GetEnumDestructable()) == 'LTlt') then
set udg_tempHighestReal = lv_dist
set udg_tempDestructable = GetEnumDestructable()
endif
endfunction
//=====================================================================
//=====================================================================
function udf_getClosestTreeToPoint takes location lp_p returns destructable
set udg_tempLocation = lp_p
set udg_tempDestructable = null
set udg_tempHighestReal = 1000.0 //Just to get the ball rolling.
call EnumDestructablesInRectAll( GetPlayableMapRect(), function udf_getClosestTreeToPointFunction1 )
set udg_tempLocation = null
set udg_tempHighestReal = 0.0
return udg_tempDestructable
//presumably these functions call in a row, and temps won't conflict
endfunction
//=====================================================================
function udf_getPlayerHarvestersOfMineCondition1 takes nothing returns boolean
return (LoadUnitHandleBJ(StringHashBJ("harvestGoldMineTarget"), GetHandleIdBJ(GetFilterUnit()), udg_UnitAI) == udg_tempUnit)
endfunction
function udf_getPlayerHarvestersOfMine takes integer lp_playerInt, unit lp_mine returns group
set udg_tempUnit = lp_mine
return GetUnitsOfPlayerMatching(Player(lp_playerInt), Condition(function udf_getPlayerHarvestersOfMineCondition1))
endfunction
function udf_getUnmaxedPlayerMinesFunction1 takes nothing returns nothing
if (CountUnitsInGroup(udf_getPlayerHarvestersOfMine(udg_tempInt, GetEnumUnit())) < 5) then
call GroupAddUnitSimple( GetEnumUnit(), udg_tempGroup )
endif
endfunction
function udf_getUnmaxedPlayerMines takes integer lp_playerInt, location lp_loc returns group
set udg_tempLocation = lp_loc
set udg_tempUnit = null
set udg_tempHighestReal = 1000.0 //Just to get the ball rolling.
set udg_tempInt = lp_playerInt
call GroupClear( udg_tempGroup )
call ForGroupBJ(udg_sAIClaimedGoldMines[lp_playerInt], function udf_getUnmaxedPlayerMinesFunction1)
//REMOVE LEAKS//========================
// (These are Globals, but doesn't hurt to clear them anyway.)
set udg_tempLocation = null
set udg_tempUnit = null
set udg_tempHighestReal = 0.0
set udg_tempInt = 0
//======================================
return udg_tempGroup
endfunction
function udf_getClosestUnmaxedPlayerMineToLocFunction1 takes nothing returns nothing
local real lv_dist = 0
set lv_dist = DistanceBetweenPoints(GetUnitLoc(GetEnumUnit()), udg_tempLocation)
if (lv_dist < udg_tempHighestReal) and (CountUnitsInGroup(udf_getPlayerHarvestersOfMine(udg_tempInt, GetEnumUnit())) < 5) then
set udg_tempHighestReal = lv_dist
set udg_tempUnit = GetEnumUnit()
endif
endfunction
function udf_getClosestUnmaxedPlayerMineToLoc takes integer lp_playerInt, location lp_loc returns unit
set udg_tempLocation = lp_loc
set udg_tempUnit = null
set udg_tempHighestReal = 1000.0 //Just to get the ball rolling.
set udg_tempInt = lp_playerInt
call ForGroupBJ(udg_sAIClaimedGoldMines[lp_playerInt], function udf_getClosestUnmaxedPlayerMineToLocFunction1)
return udg_tempUnit // theoretically could return a null so keep that in mind
endfunction
function sAI_AIClaimsNewMine takes integer lp_playerID, unit lp_mine returns nothing
local integer lv_hashSetIteration = 0 //the place where the info gets saved
local integer lv_currentListSize = 0
local string lv_parentString = ""
local string lv_stringPreFix = ""
set lv_currentListSize = LoadIntegerBJ(StringHashBJ("numberOfEntries"), StringHashBJ("goldMine"), udg_PlayerAI[lp_playerID]) + 1
set lv_hashSetIteration = lv_currentListSize
call SaveUnitHandleBJ( lp_mine, lv_hashSetIteration, StringHashBJ("goldMine"), udg_PlayerAI[lp_playerID] )
//pretty simple
endfunction
function sAI_addNewMineSuggestionToAI takes integer lp_playerID, location lp_townCentrePoint, real lp_radius returns nothing
local string lv_prestring = "mine"
local string lv_parentString = "AI_SuggestedActions"
local integer lv_currentNumOfEntries = LoadIntegerBJ(StringHashBJ(lv_prestring + "_indexCount"), StringHashBJ(lv_parentString), udg_PlayerAI[lp_playerID])
local string lv_aITown_prestring = ""
local string lv_aITown_ParentString = ""
local integer i = 1
if i <= lv_currentNumOfEntries then
call SaveIntegerBJ (1, StringHashBJ(lv_prestring + "_indexCount"), StringHashBJ(lv_parentString), udg_PlayerAI[lp_playerID])
call SaveLocationHandleBJ (lp_townCentrePoint, StringHashBJ(lv_prestring + "_loc"), StringHashBJ(lv_parentString), udg_PlayerAI[lp_playerID])
call SaveRealBJ (lp_radius, StringHashBJ(lv_prestring + "_" + I2S(i) + "_radius"), StringHashBJ(lv_parentString), udg_PlayerAI[lp_playerID])
endif
endfunction
function sAI_addNewTownSuggestion takes integer lp_playerID, location lp_townCentrePoint, real lp_radius returns nothing
local string lv_prestring = "town"
local string lv_parentString = "townSuggestion"
local integer lv_currentNumOfEntries = LoadIntegerBJ(StringHashBJ(lv_prestring + "_NumEntries"), StringHashBJ(lv_parentString), udg_PlayerAI[lp_playerID])
local boolean lv_suggestionEnabled = false //so you can pre-create and then trigger appropriately.
//Save Town Suggestion in an easily findable way. Even Loc based
// this may also save information such as improving an existing town, thus it saves towns, iterations, and such. However you want to use it.
// Actually that wouldn't be under suggestions probably, but keep the idea in mind.
local string lv_aITown_prestring = ""
local string lv_aITown_ParentString = ""
local integer lv_aiTownID = 0
// This is presumably for the PlayerAI's created town information, as opposed to just suggested.
// Maybe the AI will just maintain both. If it fulfills the conditions for one, it meets the suggestion, which is a "virtual" information set.
local integer i = 1
//============================================================================
if i <= lv_currentNumOfEntries then
call SaveIntegerBJ (1, StringHashBJ(lv_prestring + "_NumEntries"), StringHashBJ(lv_parentString), udg_PlayerAI[lp_playerID])
call SaveLocationHandleBJ (lp_townCentrePoint, StringHashBJ(lv_prestring + "_loc"), StringHashBJ(lv_parentString), udg_PlayerAI[lp_playerID])
call SaveRealBJ (lp_radius, StringHashBJ(lv_prestring + "_" + I2S(i) + "_radius"), StringHashBJ(lv_parentString), udg_PlayerAI[lp_playerID])
//radius might be superfluous for at least some things
//============================================================================
//STORE LAST CREATED TOWN SUGGESTION
//============================================================================
endif
endfunction
function sAI_addVUnitToTownSuggestion takes integer lp_playerID, integer lp_town, string lp_unitType, integer numOfUnits returns nothing
local integer lv_numOfSuggestedUnits = LoadIntegerBJ(StringHashBJ("town_" + I2S(lp_town) + "_numOfUnits"), StringHashBJ("townSuggestion"), udg_PlayerAI[lp_playerID])
local integer lv_suggestedUnitIteration = lv_numOfSuggestedUnits + 1
local string lv_savePathPreString = ""
local string lv_savePathString = ""
local string lv_savePathParentString = ""
//=======================================================================================================
//
//=======================================================================================================
// The following is basically just empty empty promises. Reminders of the kind of data they'll be saved with.
//=======================================================================================================
// UNIT ROLE VARIABLES
//=======================================================================================================
//=======================================================================================================
// UNIT POSITION VARIABLES
//=======================================================================================================
//=======================================================================================================
// UNIT ORDERS VARIABLES
//=======================================================================================================
// These probably get added via sAI add data functions.
//=======================================================================================================
//=======================================================================================================
//=======================================================================================================
//=======================================================================================================
//=======================================================================================================
//=======================================================================================================
set lv_numOfSuggestedUnits = lv_suggestedUnitIteration
set lv_savePathPreString = "town_" + I2S(lp_town)
set lv_savePathString = lv_savePathPreString + "_suggestedUnit_" + I2S(lv_suggestedUnitIteration)
set lv_savePathParentString = "townSuggestion"
call SaveStringBJ( lp_unitType, StringHashBJ(lv_savePathString + "_unitType"), StringHashBJ(lv_savePathParentString), udg_PlayerAI[lp_playerID] )
//=======================================================================================================
//SAVE LAST CREATED VIRTUAL UNIT
//=======================================================================================================
set udg_LastCreatedVUnitPath = lv_savePathString
set udg_LastCreatedVUnitParentPath = lv_savePathParentString
set udg_LastCreatedVUnitHashT = udg_PlayerAI[lp_playerID]
// store last created virtual unit so we can add data to it
//=======================================================================================================
//=======================================================================================================
// I think let's save them individually, so we have individual data. I may need to change later, if there's like 100 footmen, etc. But keep in mind.
//=======================================================================================================
//GET UNIT POSITIONING DATA
//=======================================================================================================
// More data details. Where a soldier is going to guard or patrol, etc. Let's start simple.
// This is going to include the potential of attachment like data. Is it a global position, or a local offset, if it's escorting, etc.
// IF NO ADDITIONAL DATA IS ADDED, THE COMPUTER JUST CREATES THESE UNITS FOR THE TOWN AND DOES WHAT IT WANTS.
// I think they are automatically added to the defensive force, by default. Probably can customise.
//=======================================================================================================
//=======================================================================================================
endfunction
//Huh. Pretty simple too.
function sAI_addVUnitDataJob takes string lp_jobType, integer lp_jobTarget returns nothing
// add data to last created unit
local string lv_vUnitPath = udg_LastCreatedVUnitPath
local string lv_vUnitParentPath = udg_LastCreatedVUnitParentPath
local hashtable lv_hashTable = udg_LastCreatedVUnitHashT
local string lv_unitJobType = "" // guard, worker, etc
local integer lv_jobTarget = 0 //convert and use, it... should work out? Gets Handle Id or whatev.
//============================================================================
// ADVANCED
//============================================================================
local group lv_addToGroup = null // prob in actual unit creation
local string lv_customAIDataPath = "" // a pointer to more complex info for the data
//============================================================================
//============================================================================
//SAVE VIRTUAL UNIT'S JOB
//============================================================================
call SaveStringBJ(lv_unitJobType, StringHashBJ(lv_vUnitPath + "jobType"), StringHashBJ(lv_vUnitParentPath), lv_hashTable)
call SaveIntegerBJ(lv_jobTarget, StringHashBJ(lv_vUnitPath + "jobTarget"), StringHashBJ(lv_vUnitParentPath), lv_hashTable)
// This needs to mesh with Unit job data. When an actual unit is created.
//============================================================================
//SAVE LAST CREATED DATA PATH (if necessary)
//============================================================================
endfunction
function sAI_addVUnitDataOrder takes string lp_order returns nothing // this could get more complex, but simple for now
local string lv_vUnitPath = udg_LastCreatedVUnitPath
local string lv_vUnitParentPath = udg_LastCreatedVUnitParentPath
local hashtable lv_hashTable = udg_LastCreatedVUnitHashT
local string lv_orderTypePath = ""
local integer lv_orderTypeIteration = 0 // Basically some pointers to some pre-made type of orders, to simplify it fo nao.
// Or could just have it parent-child created here, so it can be modified.
local integer lv_orderTarget = 0 // wonder if I would use a hash table to store this info
endfunction
function sAI_createOrder takes integer lp_playerID, unit lp_forUnit returns nothing // this would probably work for an order
// basically an order, but it's for a specific purpose
// Perhaps this function will create an order for each input. Like, order_index as well as order_unit_index, etc, etc, for fast future ref
local integer lv_unitTag = GetHandleId(lp_forUnit)
local string lv_orderHashString = ""
local integer lv_numOrders = 0
local string lv_parent = "orders"
local integer lv_parentInt = StringHashBJ(lv_parent)
local hashtable lv_h = udg_PlayerAI[lp_playerID]
local integer lv_index = 0
if lv_unitTag != 0 then
set lv_numOrders = LoadIntegerBJ(StringHashBJ("order_" + I2S(lv_unitTag) + "_numList"), lv_parentInt, lv_h)
set lv_index = lv_numOrders + 1
set lv_orderHashString = "order_" + I2S(lv_unitTag) + "_" + I2S(lv_index)
call SaveIntegerBJ(lv_index, StringHashBJ("order_" + I2S(lv_unitTag) + "_numList"), lv_parentInt, lv_h)
//SAVE META-DATA//=======================================================
// meta type is actually saved as the unit tag, allowing for faster reference
//call sAI_hashAddMetaData(I2S(lv_unitTag), lv_orderHashString, lv_parent, lv_h)
//=======================================================================
else
set lv_numOrders = LoadIntegerBJ(StringHashBJ("order_numList"), lv_parentInt, lv_h)
set lv_index = lv_numOrders + 1
set lv_orderHashString = "order_" + I2S(lv_unitTag) + "_" + I2S(lv_index)
call SaveIntegerBJ(lv_index, StringHashBJ("order_" + I2S(lv_unitTag) + "_numList"), lv_parentInt, lv_h)
//SAVE META-DATA//=======================================================
// meta type is actually saved as the unit tag, allowing for faster reference
//call sAI_hashAddMetaData(I2S(lv_unitTag), lv_orderHashString, lv_parent, lv_h)
//=======================================================================
endif
//call SaveStringBJ(StringHashBJ(lv_orderHashString), lv_parentInt, lv_h)
set udg_LastCreatedOrderPath = lv_orderHashString
set udg_LastCreatedOrderParentPath = lv_parent
set udg_LastCreatedOrderHashT = lv_h
set udg_LastCreatedOrderPlayerID = lp_playerID
endfunction
function sAI_createMoveOrder takes integer lp_playerID, unit lp_forUnit, hashtable lp_locationData returns nothing
// Location Data could be added at any point. In fact, it's not location, it's all data. Like destroy hostiles, but not buildings, at places, within time - etc
//It'll probably just all go under "add data to last created order". Data and mData-trees.
//local hashtable lv_locationData = udg_LastCreatedLocationData
local integer lv_index = 0
local string lv_orderType = "move"
local string lv_path = ""
local string lv_parent = ""
local integer lv_parentInt
local hashtable lv_h = null
call sAI_createOrder(lp_playerID, lp_forUnit)
// then get last created order, and add data to it here
set lv_path = udg_LastCreatedOrderPath
set lv_parent = udg_LastCreatedOrderParentPath
set lv_parentInt = StringHashBJ(lv_parent)
set lv_h = udg_LastCreatedOrderHashT
//already have player id
call SaveStringBJ(lv_orderType, StringHashBJ(lv_path + "_orderType"), lv_parentInt, lv_h) // no indexing of order type? I think I've allowed for that
//SAVE META-DATA//=======================================================
//call sAI_hashAddMetaData("orderType", lv_path, lv_parent, lv_h)
//=======================================================================
endfunction
function sAI_addLocDataToLastCreatedOrder takes location lp_loc, string lp_stringModifier returns nothing
local string lv_preString = ""
local string lv_pathString = ""
local string lv_entryString = ""
local integer lv_orderID = 0
local string lv_orderPath = ""
local string lv_metaType = "" // e.g "order" or "move" or "location" or whatever - data entry
local string lv_data = ""
local string lv_stringModifier = lp_stringModifier
call SaveLocationHandleBJ(lp_loc, StringHashBJ(udg_LastCreatedOrderPath + lv_stringModifier + "_location"), StringHashBJ(udg_LastCreatedOrderParentPath) , udg_PlayerAI[udg_LastCreatedOrderPlayerID])
//call sAI_hashAddMetaData("location" , udg_LastCreatedOrderPath , udg_LastCreatedOrderParentPath , udg_PlayerAI[udg_LastCreatedOrderPlayerID])
// create a hashtable for this - so can be transferred etc
endfunction
function sAI_createLocationDataForOrder takes nothing returns nothing
local location lv_tempAreaCentrePoint = null
local real lv_tempRadiusSize = 0
local string lv_orderPath = ""
local integer lv_orderIndex = 0
local string lv_pathString = ""
local string lv_parentString = ""
local hashtable lv_h = null
// saves information to global variable which is then used as a Last Created Location hash data.
// Or puts it directly to wherever.
endfunction
function playerSuggest_sAIAction takes string pString, integer stateValue returns nothing
//state value determines if the suggestion is critical/permanent, needs to be fulfilled only once, etc
//example dictionary suggestion is = "take a small group of men and harrass the enemy at last ping"
// these are suggestions the computer will interpret and read and execute
endfunction
function playerSuggest_clearSuggestions takes nothing returns nothing
endfunction
// A long form of player suggestion
// basically custom script but in ze sAI lingo, hopefully more efficient and direct
function sAI_unitPathFindingUpdate takes integer lp_playerID, unit lp_unit, lp_orderString returns nothing // Order String is optional, just for efficiency in right context
// An Order could be constructed simply to tree together other orders, so one root path is always the only thing needed
local location lv_pickedLoc = null
local integer lv_mapSquareX = 0
local integer lv_mapSquareY = 0
local string lv_orderPathString = lp_orderString
local integer lv_currentSquareX = 0
local integer lv_currentSquareY = 0
local string lv_unitPathFindingPath = ""
local string lv_unitPathFindingParent = ""
local hashtable lv_unitPathFindingHash = InitHashtable()
local string lv_pathRootString = ""
local string lv_parent = ""
local hashtable lv_h = udg_PlayerAI[lp_playerID]
local integer lv_unitPathFind_NumList = 0
local integer i = 0
//========================
local integer lv_recordedTimesUnitEnteredPickedSquare = 0
local integer lv_recordedTimesUnitEnteredPickedSquare = 0
local integer lv_numberOfEntriesSinceOrderIssued = 0
local integer lv_recordedTimesUnitEnteredPickedSquareSincePathInt = 0 //You can tell it to search back to the first path, or the beginning of a seq,
// or just an arbitrary number
local string lv_unitIDString = StringHashBJ(GetHandleId(lp_unit))
local string lv_unitTypeString = ""
local string lv_pickedString = ""
local integer lv_enumNumList = 0
local boolean lv_unitWasAbleToProgress = false
local boolean lv_unitMovedToPointAsExpected = false
local boolean lv_isThisFailure = false
local string lv_potentialReasonsForFailure = ""
local integer lv_eventNumList = 0
local integer lv_timesUnitEnteredSquare = 0
local boolean lv_squareObstructed = false
local string lv_rootPathObstructions = ""
local real lv_recordedTime = 0
local string lv_path = ""
local integer i2 = 0
local integer lv_recordedTimeNumList = 0
//===================================================================================================================
set lv_pickedString = lv_unitIDString + "_timesEntered"
set lv_path = lv_pathRootString + "_" + lv_pickedString
set lv_eventNumList = LoadIntegerBJ(StringHashBJ(lv_path + "_numList"), StringHashBJ(lv_parent), lv_h)
//===================================================================================================================
// GET CURRENT SQUARE
//===================================================================================================================
set lv_unitPos = GetUnitLoc(lp_unit)
set lv_currentSquareX = R2I(Abs(GetLocationX(lv_unitPos )))
set lv_currentSquareY = R2I(Abs(GetLocationY(lv_unitPos )))
set lv_pathRootString = lv_unitIDString
set lv_tempSquareString = "X_" + I2S(lv_currentSquareX) + "_Y_" + I2S(lv_currentSquareX)
//===================================================================================================================
// SAVE INSTANCE OF PATH INFORMATION (CURRENT TIME) (NO LOOP NEEDED)
//===================================================================================================================
set lv_path = lv_pathRootString + "_" + lv_tempSquareString
set lv_timesUnitEnteredSquare = LoadIntegerBJ(StringHashBJ(lv_enumUnitIDString + "_" + lv_enumSquareLocString + "_numEnteredSquare"), lv_enumUnitIDString, lv_h
set i = LoadIntegerBJ(StringHashBJ(lv_path + "_timeRecorded_numList", StringHashBJ(lv_parent), lv_h)
set lv_currentSquareLocString = "X_" + I2S(lv_currentSquareX) + "_Y_" + I2S(lv_currentSquareX)
// iterate current square + 1
call SaveIntegerBJ(lv_timesUnitEnteredSquare + 1, StringHashBJ(lv_enumUnitIDString + "_" + lv_enumSquareLocString + "_numEnteredSquare"), lv_enumUnitIDString, lv_h)
// this iteration of no. entered current square only has to happen once in this function
// also need to save the precise time iteration
call SaveIntegerBJ(lv_timesUnitEnteredSquare + 1, StringHashBJ(R2S(lv_time) + "_unitEnteredSquare" ), StringHashBJ(lv_parent), lv_h) // or sum
call SaveRealBJ(lv_recordedTime, StringHashBJ(lv_path + "_" + I2S(i) + "_timeRecorded_" + I2S(i2)), StringHashBJ(lv_parent), lv_h)
// Tidy this up (fix the last two lines to make sense, specific event data, not short-cut
//===================================================================================================================
// IS MAKING PROGRESS
//===================================================================================================================
set lv_orderTargetLoc = LoadRealBJ(StringHashBJ("order_" + I2S(lv_orderInt) + "_targetLoc"), StringHashBJ("orders"), lv_h)
set lv_distToTarget = DistanceBetweenPoints(GetUnitLoc(lv_enumUnit), lv_orderTargetLoc) // to see if it's making progress
//if it is learned that air transport or something is required in an area
//a marker is placed (or saved) so the AI remembers - also linked to an Order, or Orders
// take into account if it's stopped by external factors, orders, temporary things, like fighting hostiles
// but that should all be logged
// event_50 = "beganfighting" and what-not
set lv_timeOrderIssuedToUnit = LoadRealBJ(StringHashBJ(lv_pathRootString + "_unitOrder_" + I2S(lv_unitOrderInt) + "_timeIssued"), StringHashBJ(lv_enumUnitID), lv_UnitAI[lp_playerID])
set lv_orderInt = LoadRealBJ(StringHashBJ(lv_pathRootString + "_unitOrder_" + I2S(lv_unitOrderInt) + "_orderInt"), StringHashBJ(lv_enumUnitID), lv_UnitAI[lp_playerID])
//===================================================================================================================
// REWIND TIME AND DO THINGS
//===================================================================================================================
set lv_numEnteredSquareFromTime = 0 // leading square
set lv_timeOrderIssuedToUnit = LoadRealBJ(StringHashBJ(lv_pathRootString + "_unitOrder_" + I2S(lv_unitOrderInt) + "_timeIssued"), StringHashBJ(lv_enumUnitID), lv_UnitAI[lp_playerID])
set lv_orderInt = LoadRealBJ(StringHashBJ(lv_pathRootString + "_unitOrder_" + I2S(lv_unitOrderInt) + "_orderInt"), StringHashBJ(lv_enumUnitID), lv_UnitAI[lp_playerID])
set lv_tempReal = lv_realTimeOrderIssued // or just 60 seconds ago, etc
set lv_recordedEventTime = lv_timeOrderIssuedToUnit + 1.0
//==============================================================
set lv_recordedDistToOrderTarget = DistanceBetweenPoints(lv_recordedUnitLoc, lv_orderTargetLoc)
set lv_enumProgressMadeLastMinute = lv_currentDistToOrderTarget - lv_recordedDistToOrderTarget // Really can just grab loc - 60 seconds.
//==============================================================
loop
exitwhen lv_recordedEventTime < lv_tempReal
// so how i do this?
// if this loop occurs every second in the global process, then - 1 second should work fine as an iteration
// since this is exactly what I want, it is faster
// even faster would be if the numbers were already added, such as "number of times entered square" etc, which I can actually do later
set lv_path = "time_" + I2S(lv_time) + _"unitSquareLoc" // eh, something, can change it to whatev
set lv_parent = lv_enumUnitIDString
set lv_h = udg_UnitAI[lp_playerID]
set lv_enumSquareLoc = LoadLocationHandleBJ(lv_path, lv_parent, lv_h) // square that unit existed in in previous iteration
set lv_enumSquareX = R2I(GetLocationX(lv_enumSquareLoc))
set lv_enumSquareY = R2I(GetLocationY(lv_enumSquareLoc))
set lv_enumSquareLocString = "X_" + I2S(lv_enumSquareX) + "_Y_" + I2S(lv_enumSquareX)
set lv_enteredEnumSquareNum = LoadIntegerBJ(StringHashBJ(lv_enumUnitIDString + "_" + lv_enumSquareLocString + "_numEnteredSquare"), lv_enumUnitIDString, lv_h)
//===================================================================
// do things in here
//===================================================================
set lv_time = lv_time - 1.0
set lv_recordedEventTime = lv_time // would work in this instance (remember to get current time, which should be exactly on a second, every second, loop)
endloop
//===================================================================================================================
// FIND OBSTRUCTIONS
//===================================================================================================================
if lv_targetSquareBlocked == true then
//get number of times blocked, if it matters
endif
if lv_squareIsSameAsLast == true then
endif
if lv_unblockedPathAvailable == true then // I mean, you CAN use the normal functions too - this is like, collision useful mostly
endif
//===================================================================================================================
// DETERMINE IF UNIT IS GETTING BLOCKED
//===================================================================================================================
// scan immediate surroundings to get some gist
// analyse squares the unit keeps getting blocked on (prob can just trace to whichever square it repeated previously in an unbroken line or sum)
// or keeps repeating in a suspicious way
// probably it can just see which "lines" it broke free of, if it was momentarily blocked, and thus which one it's stuck on
//===================================================================================================================
// DETERMINE ROUTE
//===================================================================================================================
if lv_tempAngleToGoalTarget < lv_closestAngleToGoalTarget then
endif
//===================================================================================================================
// FIND POTENTIAL BLOCKERS - COMPARE TO DATABASE, STORE DATA POTENTIALS, EVALUATE BEST LOGIC
//===================================================================================================================
set lv_evalLogicPath = ""
endfunction
//probably gotta be a def choice between macro and micro moving units and checking on them etc
// but it could try to generalise that not getting to the next square within one second is shit and fail regardless, and just spam
function sAI_wasUnitPreventedFromSquare takes nothing returns nothing
local real lv_timeLeft = 0 // This is the timer of when unit is expected to be able to reach square. (Could use Time Expire trick)
local string lv_path = "expect_unitLocSquare"
local string lv_parent = "expect"
// I mean, this is a basic idea to explore. Again, start basic. This can also apply to the big order of say, trying to reach a point on another
// island and not reaching it
set lv_targetSquareX = lv_currentSquareX - 1.0
set lv_targetSquareY = lv_currentSquareY - 1.0
loop
exitwhen lv_targetSquareY > lv_currentSquareY + 1.0
set lv_enumNumOfPObstructions = LoadIntegerBJ(StringHashBJ(lv_targetSquareID + "_numObstructions", lv_parent, lv_h) // prob update to using num/meta lists for "potential" obstruction data
if lv_targetSquareX < lv_currentSquareX + 1 then
set lv_targetSquareX = lv_targetSquareX + 1
else // just to make sure it'll pass
set lv_targetSquareY = lv_targetSquareY + 1
endif
endloop
endfunction
function sAI_calcLogistics takes string lp_hashPath returns nothing
local real lv_addedTime = 0
//everything should group together in an order, so, say, an air transport is ordered to a location, a ground unit as well,
// and so the function can easily add up expected times - unit has to wait several seconds, etc
// and "is transported by" or moved by or whatever, the air transport
local real lv_failureLevel = 0 //p/h
endfunction
function sAI_playerAIManageOrder takes integer lp_playerID, string lp_orderRootPath returns nothing
local integer lv_enumWarParty = 0 // in case there's more than one, in theory
local integer lv_enumUnit = 0
local integer lv_enumTownID = 0
local string lv_enumPath = ""
local string lv_enumPathParent = ""
local hashtable lv_enumHash = ""
endfunction
function sAI_playerAIManageAllOrders takes integer lp_playerID returns nothing
local group lv_warPartyGroup = null
local unit lv_enumUnit = null
local integer i = 1
local integer lv_numListofOrders = LoadIntegerBJ(StringHashBJ("order_numList"), StringHashBJ("Orders"), udg_PlayerAI[lp_playerID])
local group lv_tempGroup = null
local integer unit_i = 1
local integer lv_numInGroup = 0
local integer lv_warPartyID = 0
local string lv_orderPath = ""
loop
exitwhen i > lv_numListOfOrders
set lv_orderPath = "order_" + I2S(i)
call sAI_playerAIManageOrder(lp_playerID, lv_orderPath)
set i = i + 1
endloop
//=====================================================================================================
//REMOVE LEAKS
//=====================================================================================================
call GroupClear(lv_warPartyGroup)
call GroupClear(lv_tempGroup)
set lv_enumUnit = null
set i = 0
set lv_numOfParties = 0
set unit_i = 0
set lv_numInGroup = 0
endfunction
function sAI_hashAddStringData takes string lp_s, string lp_pathString, string lp_parentString, hashtable lp_h returns nothing
local integer lv_metaListInt = 0
local integer i = 1
local integer lv_numOfEntries = LoadIntegerBJ( StringHashBJ(lp_pathString + "_numList"), StringHashBJ(lp_parentString), lp_h)
local integer lv_entryInt = 0
local integer lv_stringInt = 1
local integer lv_countOfEntries = 0
local boolean lv_alreadyExists = false
set udg_tempInt = 0
// needs to check for currently existing entry
//===============================================
// CHECK FOR ALREADY EXISTING ENTRY
//===============================================
if udf_hashEntryStringByIteration(lp_s,lp_pathString, lp_parentString, lp_h) == 0 then // dis wurk?
//===============================================
// ENTRY DOESN'T EXIST - CREATE ONE
//===============================================
set lv_entryInt = lv_numOfEntries + 1
call SaveIntegerBJ(lv_metaListInt, StringHashBJ(lp_pathString + "_" + lp_s + "_numList"), StringHashBJ(lp_parentString), lp_h)
//call sAI_hashAddMetaData("unit", StringHashBJ(lp_pathString), StringHashBJ(lp_parentString), lp_h)
// If entry already exists, does it add to a numList of that entry?\
// Maybe I need two functions for that reason
endif
//===============================================
//===============================================
//===============================================
//=============================================================
//REMOVE LEAKS
//=============================================================
set lv_numOfEntries = 0
set lv_stringInt = 0
//=============================================================
endfunction
function sAI_addDataToTownSuggestion takes nothing returns nothing
local real lv_adherenceLevel = 0 // This determines how closely the AI will follow the suggestion. You can softball it.
// At lower levels it will encourage the AI to fulfill the requirements, but the AI can decide other
// things take priority. Such as pulling away defensive units to join it's offensive army in a rush.
//============================================================================
//ADVANCED TOWN INFORMATION
//============================================================================
// just some temp notions to work on
local integer lv_goldValueOfTown = 0
local integer lv_woodValueOfTown = 0
local integer lv_proximityToEnemy = 0
local integer lv_proximityToClosestFriendlyTown = 0
local integer lv_levelOfSupport = 0
local integer lv_levelOfUnderThreat =
local integer lv_riskOfDestruction = 0 //could prob lead into something complex like risk of value gained or lost, and guessing whether it's worth the risk
local integer lv_militaryValueOfTown = 0 // I guess this is a simplification key. But I do want the AI to be able to dig deep.
endfunction
// That's just a template. The actual ADD functions will be specific. Add unit, add gold mine, etc. Add forest. Probably covers it.
// Anything else would probably be like "station your hero and armies here".
function sAI_saveCurrentGoldPMIncomeToTown takes nothing returns nothing
endfunction
function sAI_setDataNameMetaType takes string dataType, string dls, hashtable ht returns nothing
call sAI_saveStringParameter(dataType, "nameMetaType", dls, ht)
endfunction
function sAI_baseRemoveUnit takes integer p, integer b, unit u returns nothing
local string unitIDString = I2S(GetHandleIdBJ(u))
local string str = ""
local integer dls_i = 0
local string playerIDString = I2S(p)
local string baseIString = I2S(b)
local integer currentB = 0
local integer baseIC = 0
local region baseR = null
local boolean baseFound = false
local group baseGroup = null
local integer count = 0
local string uTS = UnitId2StringBJ(GetUnitTypeId(u))
local string eUTS = "" // enumUTS
local integer subtract = 0
local string sDataType = ""
local integer i = 0
local integer mIC = 0
//MAIN PART
call sAI_deleteDataTree("Units_" + unitIDString + "_baseID", udg_UnitAI) // this will remove it? (to make it clean- although i dunno if it affects the data search when null)
//call SaveIntegerBJ(0, 0, StringHashBJ("Units_" + unitIDString + "_baseID"), udg_UnitAI )
//call FlushChildHashtableBJ( StringHashBJ("Units_" + unitIDString + "_baseID"), udg_UnitAI )
set str = "Player_" + playerIDString + "_base_" + baseIString
set baseGroup = LoadGroupHandleBJ(0, StringHashBJ(str + "_group"), udg_PlayerAI[p])
call GroupRemoveUnit(baseGroup, u)
call GroupRemoveUnit(LoadGroupHandleBJ(0, StringHashBJ(str + "_workers"), udg_PlayerAI[p]), u)
call GroupRemoveUnit(LoadGroupHandleBJ(0, StringHashBJ(str + "_workers_idle"), udg_PlayerAI[p]), u)
call GroupRemoveUnit(LoadGroupHandleBJ(0, StringHashBJ(str + "_army"), udg_PlayerAI[p]), u)
call GroupRemoveUnit(LoadGroupHandleBJ(0, StringHashBJ(str + "_structures"), udg_PlayerAI[p]), u)
//quick cheese because these are the only types to currently exist
set str = "Player_" + playerIDString + "_base_" + baseIString
set str = str + "_has_" + UnitId2StringBJ(GetUnitTypeId(u)) + "_count"
set count = LoadIntegerBJ(0, StringHashBJ(str), udg_PlayerAI[p])
set count = count - 1
call SaveIntegerBJ(count, 0, StringHashBJ(str), udg_PlayerAI[p]) // update to params later
//UPDATE BASE TRAINING
set str = "Units_" + unitIDString + "_training"
set mIC = LoadIntegerBJ(0, StringHashBJ(str + "_metaList_indexCount"), udg_UnitAI)
loop
exitwhen (i > mIC)
set str = "Units_" + unitIDString + "_training"
set eUTS = LoadStringBJ(0, StringHashBJ(str + "_metaList_" + I2S(i)), udg_UnitAI)
if (LoadStringBJ(0, StringHashBJ(str + "_" + eUTS + "_nameMetaType"), udg_UnitAI) == "unitTypeString") then
set subtract = LoadIntegerBJ(0, StringHashBJ(str + "_" + eUTS + "_count"), udg_UnitAI)
call sAI_saveIntegerParameter(0, "count", str + "_training_" + eUTS , udg_PlayerAI[p])
set str = "Player_" + playerIDString + "_base_" + baseIString
set count = LoadIntegerBJ(0, StringHashBJ(str + "_has_building_" + eUTS + "_count"), udg_UnitAI)
set count = count - subtract
endif
set i = i + 1
endloop
//===============
//PLUG LEAKS
set unitIDString = ""
set str = ""
set dls_i = 0
set playerIDString = ""
set currentB = 0
set baseIString = ""
set baseIC = 0
set baseR = null
set baseFound = false
set baseGroup = null
set count = 0
set uTS = ""
set eUTS = ""
set subtract = 0
set sDataType = ""
set i = 0
set mIC = 0
//params
set p = 0
set b = 0
set u = null
endfunction
function sAI_baseAddUnit takes integer p, integer b, unit u returns nothing
local string unitIDString = I2S(GetHandleIdBJ(u))
local string str = ""
local integer dls_i = 0
local string playerIDString = I2S(p)
local string baseIString = I2S(b)
local integer currentB = 0
local integer baseIC = 0
local group baseGroup = null
local integer count = 0
//MAIN PART
set str = "Player_" + playerIDString + "_base_" + baseIString
set baseGroup = LoadGroupHandleBJ(0, StringHashBJ(str + "_group"), udg_PlayerAI[p])
set str = "Units_" + unitIDString + "_baseID"
if (HaveSavedValue(0, bj_HASHTABLE_INTEGER, StringHashBJ(str), udg_UnitAI) == false) then
call sAI_saveIntegerParameter(b, "baseID", "Units_" + unitIDString, udg_UnitAI)
call GroupAddUnitSimple(u, baseGroup)
set str = "Player_" + playerIDString + "_base_" + baseIString
call sAI_saveBooleanParameter(true, UnitId2StringBJ(GetUnitTypeId(u)), str + "_has", udg_PlayerAI[p])
set str = str + "_has_" + UnitId2StringBJ(GetUnitTypeId(u))
set count = LoadIntegerBJ(0, StringHashBJ(str + "_count"), udg_PlayerAI[p])
set count = count + 1
call sAI_saveIntegerParameter(count, "count", str, udg_PlayerAI[p])
//call SetUnitColor( u, GetPlayerColor(Player(1)) ) //debug
endif
//ADD TO GROUPS
if (IsUnitType(u, UNIT_TYPE_PEON) == true) then
set str = "Player_" + playerIDString + "_base_" + baseIString
set str = str + "_workers"
call GroupAddUnit(LoadGroupHandleBJ(0, StringHashBJ(str), udg_UnitAI), u)
set str = "Player_" + playerIDString + "_base_" + baseIString
set str = str + "_workers_idle"
call GroupAddUnit(LoadGroupHandleBJ(0, StringHashBJ(str), udg_UnitAI), u)
endif
if (IsUnitType(u, UNIT_TYPE_STRUCTURE) == true) then
set str = "Player_" + playerIDString + "_base_" + baseIString
set str = str + "_structures"
call GroupAddUnit(LoadGroupHandleBJ(0, StringHashBJ(str), udg_UnitAI), u)
endif
if ((IsUnitType(u, UNIT_TYPE_PEON) == false) and (IsUnitType(u, UNIT_TYPE_STRUCTURE) == false)) then
set str = "Player_" + playerIDString + "_base_" + baseIString
set str = str + "_army"
call GroupAddUnit(LoadGroupHandleBJ(0, StringHashBJ(str), udg_UnitAI), u)
endif
//===============
//PLUG LEAKS
set unitIDString = ""
set str = ""
set dls_i = 0
set playerIDString = ""
set currentB = 0
set baseIString = ""
set baseIC = 0
set baseGroup = null
set count = 0
//params
set p = 0
set b = 0
set u = null
endfunction
function sAI_assignBaseToUnit takes integer p, integer b, unit u returns nothing
local string unitIDString = I2S(GetHandleIdBJ(u))
local string str = ""
local integer dls_i = 0
local string playerIDString = I2S(p)
local string baseIString = I2S(b)
local integer currentB = 0
local integer baseIC = 0
local region baseR = null
local boolean baseFound = false
local group baseGroup = null
local integer count = 0
//MAIN PART
//===============
//REMOVE FROM CURRENT BASE
set str = "Units_" + unitIDString + "_baseID"
set currentB = LoadIntegerBJ(0, StringHashBJ(str), udg_UnitAI)
set baseIString = I2S(currentB)
if (HaveSavedValue(0, bj_HASHTABLE_INTEGER, StringHashBJ(str), udg_UnitAI) == true) then
call sAI_baseRemoveUnit(p,b,u)
endif
//ADD TO NEW BASE
set str = "Units_" + unitIDString + "_baseID"
set currentB = LoadIntegerBJ(0, StringHashBJ(str), udg_UnitAI)
set baseIString = I2S(currentB)
call sAI_baseAddUnit(p,b,u)
//===============
//PLUG LEAKS
set unitIDString = ""
set str = ""
set dls_i = 0
set playerIDString = ""
set currentB = 0
set baseIString = ""
set baseIC = 0
set baseR = null
set baseFound = false
set baseGroup = null
set count = 0
//params
set p = 0
set b = 0
set u = null
endfunction
function sAI_assignNearbyBaseToUnit takes integer p, unit u returns nothing
local string unitIDString = I2S(GetHandleIdBJ(u))
local string str = ""
local integer dls_i = 0
local string playerIDString = I2S(p)
local integer baseI = 0
local string baseIString = ""
local integer baseIC = 0
local region baseR = null
local boolean baseFound = false
local group baseGroup = null
//MAIN PART
set str = "Player_" + playerIDString + "_base_indexCount"
set baseIC = LoadIntegerBJ(0, StringHashBJ(str), udg_PlayerAI[p])
//REMOVE FROM CURRENT BASE IF ANY
set str = "Units_" + unitIDString + "_baseID"
set baseI = LoadIntegerBJ(0, StringHashBJ(str), udg_UnitAI)
if (HaveSavedValue(0, bj_HASHTABLE_INTEGER, StringHashBJ(str), udg_UnitAI) == true) then
call sAI_baseRemoveUnit(p, baseI, u)
endif
//========================================
set baseI = 1
loop
exitwhen ((baseI > baseIC) or (baseFound == true))
set baseIString = I2S(baseI)
set str = "Player_" + playerIDString + "_base_" + baseIString
set baseR = LoadRegionHandleBJ(0, StringHashBJ(str + "_region"), udg_PlayerAI[p])
if (IsUnitInRegion(baseR, u) == true) then
set baseFound = true
call sAI_baseAddUnit(p, baseI, u)
//call SetUnitColor( u, GetPlayerColor(Player(1)) ) //debug
endif
set baseI = baseI + 1
endloop
if (baseFound == false) then
//call sAI_baseAddUnit(p, 0, u) //if a base is not found nearby, assigns them to 0 "base" which basically means no base
endif
//PLUG LEAKS
set unitIDString = ""
set str = ""
set dls_i = 0
set playerIDString = ""
set baseI = 0
set baseIString = ""
set baseIC = 0
set baseR = null
set baseFound = false
set baseGroup = null
//params
set p = 0
set u = null
endfunction
function sAI_addBase takes integer p, unit townhall returns nothing
local integer dls_i = 0
local string playerIDString = I2S(p)
local integer indexCount = 0
local string str = ""
local string pS = I2S(p)
local integer index = 0
local string iS = ""
local integer numNeeded = 0
local integer currentlyBuildingCount = 0
local string prefix = ""
local group sortGroup = CreateGroup()
local group sortGroup2 = CreateGroup()
local group alreadySorted = CreateGroup()
local group saveGroup = CreateGroup()
local string baseType = ""
local real range = 1000
local unit enumUnit = null
local region baseR = CreateRegion()
local rect baseRect = null
local string baseIString = ""
local location unitLoc = null
local integer base = 0
local integer bIC = 0
//new
local boolean alreadyAssigned = false
local location townHallLoc = null
//MAIN PART
//Create new base
set str = "Player_" + I2S(p)
call sAI_addBooleanParameter( true, "base", str, udg_PlayerAI[p])
//GET BASE ID
set str = "Player_" + playerIDString + "_base"
set bIC = LoadIntegerBJ(0, StringHashBJ(str +"_indexCount"), udg_PlayerAI[p])
//set bIC = 1 //debug
set base = bIC
set udg_sAI_lastCreatedBaseID = bIC
set baseIString = I2S(base)
//PREEMPTIVELY CREATE/SAVE GROUP
set str = "Player_" + playerIDString + "_base_" + baseIString
call sAI_saveGroupParameter( saveGroup, "group", str, udg_PlayerAI[p])
// GET GROUP
// doing a chain jump adding structures to given base data structure
set unitLoc = GetUnitLoc(townhall)
call GroupAddGroup( GetUnitsInRangeOfLocAll(range, unitLoc), sortGroup )
set enumUnit = FirstOfGroup(sortGroup)
call RemoveLocation(unitLoc)
//======================
loop
exitwhen (enumUnit == null)
if (HaveSavedValue(0, bj_HASHTABLE_INTEGER, StringHashBJ("Units_" + I2S(GetHandleIdBJ(enumUnit)) + "_baseID"), udg_UnitAI) == false) then
if ( (GetConvertedPlayerId(GetOwningPlayer(enumUnit)) == p ) and (IsUnitIdType(GetUnitTypeId(enumUnit), UNIT_TYPE_STRUCTURE) == true )) then // i think units are added somewhere else also i don't think it matters
//call SetUnitColor( enumUnit, GetPlayerColor(Player(2)) ) //debug
if (IsUnitInGroup(enumUnit, alreadySorted) == true) then
//Do nothing, it'll be eliminated. I think the exponent growth should be fine.
else
call GroupAddGroup( GetUnitsInRangeOfLocAll(range, GetUnitLoc(enumUnit)), sortGroup )
call GroupAddUnitSimple(enumUnit, saveGroup)
call sAI_assignBaseToUnit(p,base,enumUnit)
call RemoveLocation(unitLoc)
set unitLoc = GetUnitLoc(enumUnit)
set baseRect = RectFromCenterSizeBJ(unitLoc, range, range)
call RegionAddRect(baseR, baseRect)
call RemoveRect(baseRect)
call RemoveLocation(unitLoc)
endif
endif
endif
call GroupRemoveUnit(sortGroup, enumUnit)
call GroupAddUnitSimple(enumUnit, alreadySorted)
set enumUnit = FirstOfGroup(sortGroup)
endloop
//SAVE GROUP TO BASE
set baseIString = I2S(bIC)
set str = "Player_" + playerIDString + "_base_" + baseIString
//call sAI_saveGroupParameter( saveGroup, "group", str, udg_PlayerAI[p]) //shouldn't need this
call sAI_saveRegionParameter( baseR, "region", str, udg_PlayerAI[p])
call sAI_saveRectParameter( RectFromCenterSizeBJ(GetUnitLoc(townhall), range, range), "rect", str, udg_PlayerAI[p])
call sAI_saveGroupParameter( CreateGroup() , "workers", str, udg_PlayerAI[p])
call sAI_saveGroupParameter( CreateGroup() , "workers_idle", str, udg_PlayerAI[p])
call sAI_saveGroupParameter( CreateGroup() , "army", str, udg_PlayerAI[p])
call sAI_saveGroupParameter( CreateGroup() , "builders", str, udg_PlayerAI[p])
call sAI_saveGroupParameter( CreateGroup() , "harvesters", str, udg_PlayerAI[p])
call sAI_saveGroupParameter( CreateGroup() , "isBuilding", str, udg_PlayerAI[p])
//This should be an entirely new base, so this should be clean.
//PLUG LEAKS
call RemoveRect(baseRect)
call RemoveLocation(unitLoc)
call DestroyGroup(sortGroup)
call DestroyGroup(sortGroup2)
call DestroyGroup(alreadySorted)
set dls_i = 0
set playerIDString = ""
set indexCount = 0
set str = ""
set pS = ""
set index = 0
set iS = ""
set numNeeded = 0
set currentlyBuildingCount = 0
set prefix = ""
set sortGroup = null
set sortGroup2 = null
set alreadySorted = null
set saveGroup = null
set baseType = ""
set range = 0
set enumUnit = null
set baseR = null
set baseRect = null
set baseIString = ""
set unitLoc = null
set base = 0
set bIC = 0
endfunction
function sAI_base_addWant_unit takes integer p, integer baseI, string uTS, integer count returns nothing
local integer dls_i = 0
local integer indexCount = 0
local string str = ""
local integer index = 0
local string iS = ""
local integer numNeeded = 0
local integer currentlyBuildingCount = 0
local string prefix = ""
local group sortGroup = CreateGroup()
local string meta_DLS = ""
local integer mDLSI = 0
local integer currentNumWanted = 0
local integer mL_indexCount = 0
local string newMIS = ""
//MAIN PART
set str = "Player_" + I2S(p) + "_base_" + I2S(baseI)
set str = str + "_wants"
set prefix = str
set str = str + "_" + uTS + "_count"
set dls_i = StringHashBJ(str)
set currentNumWanted = LoadIntegerBJ(0, dls_i, udg_PlayerAI[p])
set currentNumWanted = currentNumWanted + count
call sAI_saveBooleanParameter(true, uTS, prefix, udg_PlayerAI[p])
call sAI_saveIntegerParameter(currentNumWanted, "count", prefix + "_" + uTS, udg_PlayerAI[p])
//PLUG LEAKS
set dls_i = 0
set indexCount = 0
set str = ""
set index = 0
set iS = ""
set numNeeded = 0
set currentlyBuildingCount = 0
set prefix = ""
call DestroyGroup(sortGroup)
set sortGroup = null
set meta_DLS = ""
set mDLSI = 0
set currentNumWanted = 0
set mL_indexCount = 0
set newMIS = ""
//params
set p = 0
set baseI = 0
set uTS = ""
set count = 0
endfunction
//===================================================
function sAI_addUnitTrainingKnowledge takes integer p, string trainerString, string trainedString returns nothing // Are these id strings or unit type strings? prob latter
local string str = ""
local integer dls_i = 0
local integer i = 0
local integer iC = 0
//MAIN PART
// SAVE TERM KNOWLEDGE
//I'm treating Terms much the same as normal data atm, but do want a faster system with less mem use.
set str = trainedString + "_built_by"
call sAI_addBooleanParameter( true, trainerString , str ,udg_Terms[p])
set str = trainerString + "_can_build"
call sAI_addBooleanParameter( true, trainedString , str ,udg_Terms[p]) //This isn't a duplication. It's slightly different from the super-fast access Term use.
//PLUG LEAKS
set str = ""
set dls_i = 0
set i = 0
set iC = 0
//PARAMS
set p = 0
set trainerString = ""
set trainedString = ""
endfunction
//===================================================
//===================================================
function sAI_base_AI takes integer p, integer baseI returns nothing
//it checks it's "wants", trains
// also directs home defense and signals for help
local string uTS = ""
local integer dls_i = 0
local integer indexCount = 0
local string str = ""
local integer index = 0
local string iS = ""
local integer numNeeded = 0
local integer currentlyHave = 0
local integer currentlyBuilding = 0
local group sortGroup = CreateGroup()
local group baseGroup = null
local string str2 = ""
local string prefix = ""
local string prefix2 = ""
local integer count = 0
local integer addCount = 0
local integer i = 0
local integer iEnd = 0
local boolean processFinished = false
local real goldRequired = 0
local real gold = GetPlayerState(Player(p), PLAYER_STATE_RESOURCE_GOLD)
local real woodRequired = 0
local real wood = GetPlayerState(Player(p), PLAYER_STATE_RESOURCE_LUMBER)
local real foodRequired = 0
local real food = (GetPlayerState(Player(p), PLAYER_STATE_RESOURCE_FOOD_CAP) - GetPlayerState(Player(p), PLAYER_STATE_RESOURCE_FOOD_USED))
local integer previousCount = 0
local integer newUnitsQueued = 0
local unit enumUnit = null
local boolean newLoop = false
local integer unitsInGroup = 0
//GetPlayerState(Player(0), PLAYER_STATE_FOOD_CAP_CEILING)
// NEW VARIABLES (REQUIRE LEAKS PLUGGED)
local string reqUTS = "" //requirement for unit, creating a one-off type deal, being needed for a single purpose (creating a unit)
local location l = null
local rect baseRect = null
local region baseR = null
local integer reqI = 0
local integer reqIC = 0
local string reqS = ""
local string prefixBase = ""
local string dataType = ""
local integer mIC = 0
local integer mI = 0
local string cBIS = "" //building id string
//=========================================================================================
//MAIN PART
//=========================================================================================
set str = "Player_" + I2S(p) + "_base_" + I2S(baseI)
set dls_i = StringHashBJ(str + "_group")
set baseGroup = LoadGroupHandleBJ(0, dls_i, udg_PlayerAI[p])
call GroupAddGroup(baseGroup, sortGroup)
set unitsInGroup = CountUnitsInGroup(sortGroup)
set str = "Player_" + I2S(p) + "_base_" + I2S(baseI) + "_region"
set baseRect = LoadRectHandleBJ(0, StringHashBJ("Player_" + I2S(p) + "_base_" + I2S(baseI) + "_rect"), udg_PlayerAI[p])
//set baseR = LoadRegionHandleBJ(0, StringHashBJ(str), udg_PlayerAI[p]) //just doesn't work
set l = GetRandomLocInRect(baseRect) // this will need to be changed to just randomly picking a building in group and then offset from it
set str = "Player_" + I2S(p) + "_base_" + I2S(baseI) + "_wants"
set prefix = str
set str = str + "_indexCount"
set dls_i = StringHashBJ(str)
set indexCount = LoadIntegerBJ(0, dls_i, udg_PlayerAI[p]) // this should actually be 0, but fix later
set mIC = LoadIntegerBJ(0, StringHashBJ(prefix + "_metaList_indexCount"), udg_PlayerAI[p]) // this will get everything incl. dataName etc, unless changed to Child key.
set prefix2 = "Player_" + I2S(p) + "_base_" + I2S(baseI) + "_has"
set prefixBase = "Player_" + I2S(p) + "_base_" + I2S(baseI)
/*
if (p == udg_herodinPlayerID) then
call DisplayTextToForce( GetPlayersAll(), "baseAI begun" )
call DisplayTextToForce( GetPlayersAll(), "player: " + I2S(p) )
call DisplayTextToForce( GetPlayersAll(), "base: " + I2S(baseI) )
endif
*/
//=========================================================================================
set index = 1
loop
exitwhen (index > mIC)
if (p == udg_herodinPlayerID) then
//call DisplayTextToForce( GetPlayersAll(), "started loop" )
//call DisplayTextToForce( GetPlayersAll(), "unitsInGroup: " + I2S(unitsInGroup) )
endif
set iS = I2S(index)
set str = prefix + "_metaList_" + iS // it's doing it here
set dls_i = StringHashBJ(str)
set uTS = LoadStringBJ(0, dls_i, udg_PlayerAI[p])
//prefix2 = "Player_" + I2S(p) + "_base_" + I2S(baseI) + "_has"
set str = prefix2 + "_" + uTS + "_count"
set currentlyHave = LoadIntegerBJ(0, StringHashBJ(str), udg_PlayerAI[p])
set str = prefix2 + "_building_" + uTS + "_count"
set currentlyBuilding = LoadIntegerBJ(0, StringHashBJ(str), udg_PlayerAI[p])
set str = prefix + "_" + uTS + "_count"
set count = LoadIntegerBJ(0, StringHashBJ(str), udg_PlayerAI[p]) // how much wanted
set addCount = count - currentlyHave - currentlyBuilding
if (p == udg_herodinPlayerID) then
/*
call DisplayTextToForce( GetPlayersAll(), "dls: " + prefix2 + "_building_" + uTS + "_count" )
call DisplayTextToForce( GetPlayersAll(), "uTS: " + uTS )
call DisplayTextToForce( GetPlayersAll(), "addCount: " + I2S(addCount) )
call DisplayTextToForce( GetPlayersAll(), "currentlyBuilding: " + I2S(currentlyBuilding) )
call DisplayTextToForce( GetPlayersAll(), "currentlyHave: " + I2S(currentlyHave) )
*/
endif
if (addCount >0) then
if (p == udg_herodinPlayerID) then
//call DisplayTextToForce( GetPlayersAll(), "addcount more than 0" )
endif
set i = 1
set iEnd = 250 // just temp blocker atm, I'll plug everything later :3
set enumUnit = FirstOfGroup(sortGroup)
loop
exitwhen ((processFinished == true) or (enumUnit == null))
if (p == udg_herodinPlayerID) then
//call DisplayTextToForce( GetPlayersAll(), "second loop begun" )
endif
//add all units that can train unit in here
//prefix2 = "Player_" + I2S(p) + "_base_" + I2S(baseI) + "_has"
set previousCount = addCount
set str = prefix2 + "_" + uTS + "_count"
set currentlyHave = LoadIntegerBJ(0, StringHashBJ(str), udg_PlayerAI[p])
set str = prefix2 + "_building_" + uTS + "_count"
set currentlyBuilding = LoadIntegerBJ(0, StringHashBJ(str), udg_PlayerAI[p])
set str = prefix + "_" + uTS + "_count"
set count = LoadIntegerBJ(0, StringHashBJ(str), udg_PlayerAI[p]) // how much wanted
set addCount = count - currentlyHave - currentlyBuilding
//================================
//TRAIN UNIT PART
//================================
// prefixBase = "Player_" + I2S(p) + "_base_" + I2S(baseI)
if (IsUnitInGroup(enumUnit, LoadGroupHandleBJ(0, StringHashBJ(prefixBase + "_builders"), udg_PlayerAI[p])) == false) then
if (IsUnitIdType(String2UnitIdBJ(uTS), UNIT_TYPE_STRUCTURE) == false ) then
call IssueTrainOrderByIdBJ(enumUnit, String2UnitIdBJ(uTS))
else
call IssueBuildOrderByIdLocBJ( enumUnit, String2UnitIdBJ(uTS), l)
endif
if (p == udg_herodinPlayerID) then
/*
call DisplayTextToForce( GetPlayersAll(), "should have started building uTS" )
call DisplayTextToForce( GetPlayersAll(), "uTS: " + uTS )
call DisplayTextToForce( GetPlayersAll(), "trainer: " + GetUnitName(enumUnit) )
//call DisplayTextToForce( GetPlayersAll(), "unitsInGroup: " + I2S(unitsInGroup) )
call DisplayTextToForce( GetPlayersAll(), "mIC: " + I2S(mIC) )
call DisplayTextToForce( GetPlayersAll(), "addCount: " + I2S(addCount) )
*/
endif
//================================
//REQS
//================================
set str = "UnitType_" + uTS + "_req_indexCount" // data from Terms, what the Player understands (information can be manually set)
set dls_i = StringHashBJ(str)
set reqIC = LoadIntegerBJ(0, dls_i, udg_Terms[p])
set reqI = 1
loop
exitwhen (reqI > reqIC)
set reqS = LoadStringBJ(0, StringHashBJ("UnitType_" + uTS + "_req_" + I2S(reqI)), udg_Terms[p]) // this gives us the req unit type string
// this all needs to be checked, it seems wonky
set str = prefix2 + "_" + reqS + "_count"
set dls_i = StringHashBJ(str)
set currentlyHave = LoadIntegerBJ(0, dls_i, udg_PlayerAI[p])
set str = prefix2 + "_building_" + reqS + "_count"
set dls_i = StringHashBJ(str)
set currentlyBuilding = LoadIntegerBJ(0, dls_i, udg_PlayerAI[p])
set dls_i = StringHashBJ(reqS)
if ((currentlyHave - currentlyBuilding) > 0 ) then // quick cheese, it just needs to make a minimum of one in all cases
if (IsUnitIdType(String2UnitIdBJ(reqS), UNIT_TYPE_STRUCTURE) == false ) then
call IssueTrainOrderByIdBJ(enumUnit, String2UnitIdBJ(uTS))
else
call IssueBuildOrderByIdLocBJ( enumUnit, String2UnitIdBJ(uTS), l) // this is covered by a issued order trigger
endif
//call DisplayTextToForce( GetPlayersAll(), "should have started building req" )
endif
//checking the queue count for the req units too
set reqI = reqI + 1
endloop
endif
//===============================================
set newUnitsQueued = previousCount - addCount // this gets the difference in units wanted between cycles, if it hasn't changed since last then it's stuck
//check this
if (newUnitsQueued <= 0) then
if (newLoop == true) then
set processFinished = true
endif
endif
if (addCount <= 0) then
set processFinished = true
endif
if (i > iEnd) then
set processFinished = true
endif
if(udf_playerCanAffordUnit(String2UnitIdBJ(uTS), p) == false) then
//set processFinished = true
endif
//===============================================
//cycle, remove unit, new unit, group loop, etc
// in its best life just adds a train order one at a time to individual trainers until it's queued up enough
//===============================================
call GroupRemoveUnitSimple(enumUnit,sortGroup)
set enumUnit = FirstOfGroup(sortGroup)
//===============================================
// if sortGroup becomes empty it's time for a new loop
if (newLoop == true) then
set newLoop = false
endif
if (enumUnit == null) then
call GroupAddGroup(baseGroup, sortGroup)
set enumUnit = FirstOfGroup(sortGroup)
set newLoop = true
endif
//===============================================
set i = i + 1
endloop
call GroupAddGroup(baseGroup, sortGroup) // resets group
endif
// just keep rechecking number being trained
// add all units capable of training to the sortGroup, and check when they're all full and can't train anymore
// and also that economic requirements are met
// and add an arbitrary limiter just in case
set index = index + 1
endloop
// Construction will be covered in the train unit parts. Sometimes units are required to be upgraded to as well.
//=========================================================================================
//PLUG LEAKS
//=========================================================================================
set uTS = ""
set dls_i = 0
set indexCount = 0
set str = ""
set index = 0
set iS = ""
set numNeeded = 0
set currentlyHave = 0
set currentlyBuilding = 0
call DestroyGroup(sortGroup)
set sortGroup = null
set baseGroup = null
set str2 = ""
set prefix = ""
set prefix2 = ""
set count = 0
set addCount = 0
set i = 0
set iEnd = 0
set goldRequired = 0
set gold = 0
set woodRequired = 0
set wood = 0
set foodRequired = 0
set food = 0
set previousCount = 0
set newUnitsQueued = 0
set enumUnit = null
set newLoop = false
set processFinished = false
endfunction
function Trig_test_x_gets_ids_of_unit_Actions takes nothing returns nothing
local integer b = 0
local group g = GetUnitsSelectedAll(GetTriggerPlayer())
local unit u = FirstOfGroup(g)
//MAIN PART
set b = LoadIntegerBJ(0, StringHashBJ("Units_" + I2S(GetHandleIdBJ(u)) + "_baseID"), udg_UnitAI)
call DisplayTextToForce( GetPlayersAll(), "unitID: " + I2S(GetHandleIdBJ(u)) )
call DisplayTextToForce( GetPlayersAll(), "playerID: " + I2S(GetConvertedPlayerId(GetOwningPlayer(u))) )
call DisplayTextToForce( GetPlayersAll(), "baseID: " + I2S(b) )
//PLUG LEAKS
call DestroyGroup(g)
set g = null
set u = null
set b = 0
endfunction
//===========================================================================
function InitTrig_test_x_gets_ids_of_unit takes nothing returns nothing
set gg_trg_test_x_gets_ids_of_unit = CreateTrigger( )
call TriggerRegisterPlayerChatEvent( gg_trg_test_x_gets_ids_of_unit, Player(0), "1", true )
call TriggerAddAction( gg_trg_test_x_gets_ids_of_unit, function Trig_test_x_gets_ids_of_unit_Actions )
endfunction
function udf_calculateEricPartyStats takes group lp_g returns nothing
local real lv_partyOriginalHealth = udg_Eric_PartyStartingHealth
local real lv_partyOriginalNumbers = I2R(udg_Eric_PartyStartingNumbers)
local real lv_baseTotalHealth = 0
local real lv_remainingTotalHealth = 0
local group lv_sortGroupAlt = CreateGroup()
local unit lv_enumUnit = null
local integer lv_numRemaining = 0
call GroupAddGroup( udg_Eric_Group, lv_sortGroupAlt)
set lv_numRemaining = CountUnitsInGroup(lv_sortGroupAlt)
set udg_Eric_PartyStartingNumbers = lv_numRemaining
loop
exitwhen (lv_numRemaining <= 0)
set lv_enumUnit = FirstOfGroup(lv_sortGroupAlt)
set lv_remainingTotalHealth = lv_remainingTotalHealth + GetUnitStateSwap(UNIT_STATE_LIFE, lv_enumUnit)
set lv_baseTotalHealth = lv_baseTotalHealth + GetUnitStateSwap(UNIT_STATE_MAX_LIFE, lv_enumUnit)
set lv_numRemaining = lv_numRemaining -1
call GroupRemoveUnitSimple(lv_enumUnit, lv_sortGroupAlt) //i'm assuming this doesn't remove from original unit, and the groups are copies
endloop
set udg_Eric_PartyStartingHealth = lv_baseTotalHealth
if (lv_baseTotalHealth > 0) then
set udg_Eric_PartyHealthQuotient = lv_remainingTotalHealth / lv_baseTotalHealth
endif
set udg_Eric_PartyHealthQuotient = udg_Eric_PartyHealthQuotient * (udg_Eric_PartyStartingNumbers - lv_numRemaining)
//this should work fine
set udg_Eric_PartyRemainingHealth = lv_remainingTotalHealth
//PLUG LEAKS
call DestroyGroup (lv_sortGroupAlt)
set lv_baseTotalHealth = 0
set lv_remainingTotalHealth = 0
set lv_partyOriginalHealth = 0
set lv_partyOriginalNumbers = 0
set lv_enumUnit = null
set lv_numRemaining = 0
//PARAMS
set lp_g = null // i assume this group is actually a udg, so don't destroy it
endfunction
function sAI_addUnitToEricParty takes unit u returns nothing
local integer lv_numRemaining = CountUnitsInGroup(udg_Eric_Group)
local integer p = GetPlayerId(GetOwningPlayer(u))
local integer b = 0
local string unitIDString = I2S(GetHandleIdBJ(u))
//MAIN PART
set b = LoadIntegerBJ(0, StringHashBJ("Units_" + unitIDString + "_baseID"), udg_UnitAI)
set udg_Eric_PartyStartingHealth = udg_Eric_PartyStartingHealth + GetUnitStateSwap(UNIT_STATE_MAX_LIFE, u)
set udg_Eric_PartyRemainingHealth = udg_Eric_PartyRemainingHealth + GetUnitStateSwap(UNIT_STATE_LIFE, u)
set lv_numRemaining = lv_numRemaining + 1
call sAI_baseRemoveUnit(p, b, u) //hopefully no errors occur with this, like unit not being properly added to a returned default 0
call GroupAddUnitSimple(u, udg_Eric_Group)
if (udg_Eric_PartyStartingHealth > 0) then
set udg_Eric_PartyHealthQuotient = udg_Eric_PartyRemainingHealth / udg_Eric_PartyStartingHealth
else
set udg_Herodin_PartyStartingHealth = 0
endif
//PLUG LEAKS
set lv_numRemaining = 0
set p = 0
set b = 0
set unitIDString = ""
//PARAMS
set u = null
endfunction
function sAI_removeUnitFromEricParty takes unit u returns nothing
local integer lv_numRemaining = CountUnitsInGroup(udg_Eric_Group)
//MAIN PART
set udg_Eric_PartyStartingHealth = udg_Eric_PartyStartingHealth - GetUnitStateSwap(UNIT_STATE_MAX_LIFE, u)
set udg_Eric_PartyRemainingHealth = udg_Eric_PartyRemainingHealth - GetUnitStateSwap(UNIT_STATE_LIFE, u)
set udg_Eric_PartyStartingNumbers = udg_Eric_PartyStartingNumbers - 1
call GroupRemoveUnit(udg_Eric_Group, u)
if (udg_Eric_PartyStartingHealth > 0) then
set udg_Eric_PartyHealthQuotient = udg_Eric_PartyRemainingHealth / udg_Eric_PartyStartingHealth
else
set udg_Eric_PartyStartingHealth = 0
endif
//PLUG LEAKS
set lv_numRemaining = 0
//PARAMS
set u = null
endfunction
function sAI_testUnitForTrainAbility takes integer p, unit u returns nothing
//use this later for the ai to generate its own data, learning etc
endfunction
function sAI_cycleUnitAbilitiesAndReturn takes integer p, unit u returns nothing
// a sort of enum function, to help AI test its abilities and what each unit can do
// hopefully there is actually a way to cycle abilities other than manually writing each one down and then testing the entire list
set udg_tempString = ""
endfunction
//==========================================================================
function sAI_playerAI_pregenReqs takes integer p returns nothing
local string prefix = ""
local string str = ""
local string dls = ""
local integer dls_i = 0
local string uTS = ""
local integer reqI = 0
local string reqS = ""
//========================================================================
//HUMAN ALLIANCE
//========================================================================
//HUMAN FOOTMAN
set uTS = UnitId2StringBJ('hfoo')
set reqS = UnitId2StringBJ('hbar')
set str = "UnitType_" + uTS + "_req_" + I2S(reqI)
set dls_i = StringHashBJ(str)
call SaveStringBJ(str, 0, dls_i, udg_Terms[p])
//HUMAN VETERAN
set uTS = UnitId2StringBJ('h00N')
set reqS = UnitId2StringBJ('hbar')
set str = "UnitType_" + uTS + "_req_" + I2S(reqI)
set dls_i = StringHashBJ(str)
call SaveStringBJ(str, 0, dls_i, udg_Terms[p])
//HUMAN KNIGHT
set reqI = 1
set uTS = UnitId2StringBJ('hkni')
set reqS = UnitId2StringBJ('hbar')
set str = "UnitType_" + uTS + "_req_" + I2S(reqI)
set dls_i = StringHashBJ(str)
call SaveStringBJ(str, 0, dls_i, udg_Terms[p])
//========
set reqI = reqI + 1
set reqS = UnitId2StringBJ('hbla')
set str = "UnitType_" + uTS + "_req_" + I2S(reqI)
set dls_i = StringHashBJ(str)
call SaveStringBJ(str, 0, dls_i, udg_Terms[p])
//========
set reqI = reqI + 1
set reqS = UnitId2StringBJ('hcas')
set str = "UnitType_" + uTS + "_req_" + I2S(reqI)
set dls_i = StringHashBJ(str)
call SaveStringBJ(str, 0, dls_i, udg_Terms[p])
//HUMAN HUNTER
set reqI = 1
set uTS = UnitId2StringBJ('n006')
set reqS = UnitId2StringBJ('hbar')
set str = "UnitType_" + uTS + "_req_" + I2S(reqI)
set dls_i = StringHashBJ(str)
call SaveStringBJ(str, 0, dls_i, udg_Terms[p])
//HUMAN PEASANT
set uTS = UnitId2StringBJ('hpea')
set reqS = UnitId2StringBJ('htow')
set str = "UnitType_" + uTS + "_req_" + I2S(reqI)
set dls_i = StringHashBJ(str)
call SaveStringBJ(str, 0, dls_i, udg_Terms[p])
//HUMAN GUARD TOWER
set uTS = UnitId2StringBJ('hgtw') // human guard tower
set reqS = UnitId2StringBJ('hwtw') //normal scout tower which is required for it to upgrade
set str = "UnitType_" + uTS + "_req_" + I2S(reqI)
set dls_i = StringHashBJ(str)
call SaveStringBJ(str, 0, dls_i, udg_Terms[p])
//HUMAN CANNON TOWER
set uTS = UnitId2StringBJ('hgtw')
set reqS = UnitId2StringBJ('hwtw')
set str = "UnitType_" + uTS + "_req_" + I2S(reqI)
set dls_i = StringHashBJ(str)
call SaveStringBJ(str, 0, dls_i, udg_Terms[p])
//ALLIANCE ARCANE TOWER
set uTS = UnitId2StringBJ('hgtw')
set reqS = UnitId2StringBJ('hwtw')
set str = "UnitType_" + uTS + "_req_" + I2S(reqI)
set dls_i = StringHashBJ(str)
call SaveStringBJ(str, 0, dls_i, udg_Terms[p])
//ALLIANCE BARRACKS
set uTS = UnitId2StringBJ('hbar')
set reqS = UnitId2StringBJ('htow')
set str = "UnitType_" + uTS + "_req_" + I2S(reqI)
set dls_i = StringHashBJ(str)
call SaveStringBJ(str, 0, dls_i, udg_Terms[p])
//ALLIANCE BLACKSMITH
set uTS = UnitId2StringBJ('hbla')
set reqS = UnitId2StringBJ('hbar')
set str = "UnitType_" + uTS + "_req_" + I2S(reqI)
set dls_i = StringHashBJ(str)
call SaveStringBJ(str, 0, dls_i, udg_Terms[p])
//ALLIANCE KEEP
set uTS = "hkee"
set reqS = "htow"
set str = "UnitType_" + uTS + "_req_" + I2S(reqI)
set dls_i = StringHashBJ(str)
call SaveStringBJ(str, 0, dls_i, udg_Terms[p])
//ALLIANCE CASTLE
set uTS = UnitId2StringBJ('hcas')
set reqS = UnitId2StringBJ('hkee')
set str = "UnitType_" + uTS + "_req_" + I2S(reqI)
set dls_i = StringHashBJ(str)
call SaveStringBJ(str, 0, dls_i, udg_Terms[p])
//========================================================================
//DWARVES
//========================================================================
//RIFLEMAN
set reqI = 1
set uTS = UnitId2StringBJ('hrif')
set reqS = UnitId2StringBJ('hbar')
set str = "UnitType_" + uTS + "_req_" + I2S(reqI)
set dls_i = StringHashBJ(str)
call SaveStringBJ(str, 0, dls_i, udg_Terms[p])
//DWARF WORKER
set reqI = 1
set uTS = UnitId2StringBJ('h014')
set reqS = UnitId2StringBJ('h00S')
set str = "UnitType_" + uTS + "_req_" + I2S(reqI)
set dls_i = StringHashBJ(str)
call SaveStringBJ(str, 0, dls_i, udg_Terms[p])
//========================================================================
//UNDEAD
//========================================================================
//UNDEAD SPIRIT TOWER
set uTS = UnitId2StringBJ('uzg1')
set reqS = UnitId2StringBJ('uzig')
set str = "UnitType_" + uTS + "_req_" + I2S(reqI)
set dls_i = StringHashBJ(str)
call SaveStringBJ(str, 0, dls_i, udg_Terms[p])
//UNDEAD NERUBIAN TOWER
set uTS = UnitId2StringBJ('uzg2')
set reqS = UnitId2StringBJ('uzig')
set str = "UnitType_" + uTS + "_req_" + I2S(reqI)
set dls_i = StringHashBJ(str)
call SaveStringBJ(str, 0, dls_i, udg_Terms[p])
//UNDEAD HAUNTED GOLD MINE
set uTS = UnitId2StringBJ('ugol')
set reqS = UnitId2StringBJ('ngol')
set str = "UnitType_" + uTS + "_req_" + I2S(reqI)
set dls_i = StringHashBJ(str)
call SaveStringBJ(str, 0, dls_i, udg_Terms[p])
endfunction
function sAI_ericPlayerAI_init takes nothing returns nothing
local unit townhall = udg_ericFirstTH
local integer p = udg_ericPlayerID
local integer base = 1
call sAI_addBase(p, townhall)
set base = udg_sAI_lastCreatedBaseID
//Veterans
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('h00N'), 3)
//Footmen
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('hfoo'), 6)
//Hunters
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('n006'), 4)
//Peasants
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('hpea'), 8)
//buildings
//Guard Tower
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('hgtw'), 4)
//Town Hall
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('hcas'), 1)
//Barracks
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('hbar'), 2)
//Lumber Mill
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('hlum'), 1)
//Blacksmith
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('hbla'), 1)
//Altar of Kings
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('halt'), 1)
//Farms
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('hhou'),10)
//PLUG LEAKS
set townhall = null
set p = 0
set base = 0
endfunction
function sAI_undeadBluePlayerAI_init takes nothing returns nothing
local unit townhall = udg_undeadBlueFirstTH
local integer p = udg_undeadBluePlayerID
local integer base = 1
call sAI_addBase(p, townhall)
set base = udg_sAI_lastCreatedBaseID
//Ghouls
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('ugol'), 6)
//Child of Gro'dar
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('u001'), 6)
//Crypt Fiends
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('ucry'), 3)
//Carrion Beetles
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('u009'), 4)
//Acolytes
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('uaco'), 5)
//buildings
//Spirit Tower
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('uzg1'), 6)
//Black Citadel
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('unp2'), 1)
//Graveyard
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('ugrv'), 1)
//Crypt
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('usep'), 1)
//Slaughterhouse
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('uslh'), 1)
//PLUG LEAKS
set townhall = null
set p = 0
set base = 0
endfunction
function sAI_undeadVioletPlayerAI_init takes nothing returns nothing
local unit townhall = udg_undeadVioletFirstTH
local integer p = udg_undeadVioletPlayerID
local integer base = 1
call sAI_addBase(p, townhall)
set base = udg_sAI_lastCreatedBaseID
//Ghouls
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('ugol'), 6)
//Child of Gro'dar
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('u001'), 6)
//Crypt Fiends
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('ucry'), 3)
//Carrion Beetles
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('u009'), 4)
//Acolytes
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('uaco'), 5)
//buildings
//Spirit Tower
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('uzg1'), 6)
//Black Citadel
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('unp2'), 1)
//Graveyard
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('ugrv'), 1)
//Crypt
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('usep'), 1)
//Slaughterhouse
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('uslh'), 1)
//PLUG LEAKS
set townhall = null
set p = 0
set base = 0
endfunction
function sAI_undeadGreyPlayerAI_init takes nothing returns nothing
local unit townhall = udg_undeadGreyFirstTH
local integer p = udg_undeadGreyPlayerID
local integer base = 1
call sAI_addBase(p, townhall)
//Ghouls
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('ugol'), 6) // how does this work with duplicated names?
//Child of Gro'dar
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('u001'), 6)
//Crypt Fiends
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('ucry'), 3)
//Carrion Beetles
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('u009'), 4)
//Acolytes
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('uaco'), 5)
//buildings
//Spirit Tower
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('uzg1'), 6)
//Black Citadel
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('unp2'), 1)
//Graveyard
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('ugrv'), 1)
//Crypt
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('usep'), 1)
//Slaughterhouse
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('uslh'), 1)
//PLUG LEAKS
set townhall = null
set p = 0
set base = 0
endfunction
function udf_calculateHerodinPartyStats takes group lp_g returns nothing
local real lv_partyOriginalHealth = udg_Herodin_PartyStartingHealth
local real lv_partyOriginalNumbers = I2R(udg_Herodin_PartyStartingNumbers)
local real lv_baseTotalHealth = 0
local real lv_remainingTotalHealth = 0
local group lv_sortGroupAlt = CreateGroup()
local unit lv_enumUnit = null
local integer lv_numRemaining = 0
call GroupAddGroup( udg_Herodin_Group, lv_sortGroupAlt)
set lv_numRemaining = CountUnitsInGroup(lv_sortGroupAlt)
set udg_Herodin_PartyStartingNumbers = lv_numRemaining
loop
exitwhen (lv_numRemaining <= 0)
set lv_enumUnit = FirstOfGroup(lv_sortGroupAlt)
set lv_remainingTotalHealth = lv_remainingTotalHealth + GetUnitStateSwap(UNIT_STATE_LIFE, lv_enumUnit)
set lv_baseTotalHealth = lv_baseTotalHealth + GetUnitStateSwap(UNIT_STATE_MAX_LIFE, lv_enumUnit)
set lv_numRemaining = lv_numRemaining -1
call GroupRemoveUnitSimple(lv_enumUnit, lv_sortGroupAlt)
endloop
set udg_Herodin_PartyStartingHealth = lv_baseTotalHealth
if (lv_baseTotalHealth > 0) then
set udg_Herodin_PartyHealthQuotient = lv_remainingTotalHealth / lv_baseTotalHealth
endif
set udg_Herodin_PartyHealthQuotient = udg_Herodin_PartyHealthQuotient * (udg_Herodin_PartyStartingNumbers - lv_numRemaining)
//this should work fine
set udg_Herodin_PartyRemainingHealth = lv_remainingTotalHealth
//PLUG LEAKS
call DestroyGroup (lv_sortGroupAlt)
set lv_baseTotalHealth = 0
set lv_remainingTotalHealth = 0
set lv_partyOriginalHealth = 0
set lv_partyOriginalNumbers = 0
set lv_enumUnit = null
set lv_numRemaining = 0
endfunction
function sAI_addUnitToHerodinParty takes unit u returns nothing
local integer lv_numRemaining = CountUnitsInGroup(udg_Herodin_Group)
local integer p = GetPlayerId(GetOwningPlayer(u))
local integer b = 0
local string unitIDString = I2S(GetHandleIdBJ(u))
//MAIN PART
set b = LoadIntegerBJ(0, StringHashBJ("Units_" + unitIDString + "_baseID"), udg_UnitAI)
set udg_Herodin_PartyStartingHealth = udg_Herodin_PartyStartingHealth + GetUnitStateSwap(UNIT_STATE_MAX_LIFE, u)
set udg_Herodin_PartyRemainingHealth = udg_Herodin_PartyRemainingHealth + GetUnitStateSwap(UNIT_STATE_LIFE, u)
set lv_numRemaining = lv_numRemaining + 1
call sAI_baseRemoveUnit(p, b, u) //hopefully no errors occur with this, like unit not being properly added to a returned default 0
call GroupAddUnitSimple(u, udg_Herodin_Group)
if (udg_Herodin_PartyStartingHealth > 0) then
set udg_Herodin_PartyHealthQuotient = udg_Herodin_PartyRemainingHealth / udg_Herodin_PartyStartingHealth
else
set udg_Herodin_PartyStartingHealth = 0
endif
//maybe should make this recalculate cleanly somehow to avoid errors, that shouldn't be an issue
// add all remaining life and incl new unit
// and update numbers, so we know if there's replacement or whatev if need to count dat
//PLUG LEAKS
set lv_numRemaining = 0
set p = 0
set b = 0
set unitIDString = ""
endfunction
function sAI_removeUnitFromHerodinParty takes unit u returns nothing
local integer lv_numRemaining = CountUnitsInGroup(udg_Herodin_Group)
//MAIN PART
set udg_Herodin_PartyStartingHealth = udg_Herodin_PartyStartingHealth - GetUnitStateSwap(UNIT_STATE_MAX_LIFE, u)
set udg_Herodin_PartyRemainingHealth = udg_Herodin_PartyRemainingHealth - GetUnitStateSwap(UNIT_STATE_LIFE, u)
set udg_Herodin_PartyStartingNumbers = udg_Herodin_PartyStartingNumbers - 1
call GroupRemoveUnit(udg_Herodin_Group, u)
if (udg_Herodin_PartyStartingHealth > 0) then
set udg_Herodin_PartyHealthQuotient = udg_Herodin_PartyRemainingHealth / udg_Herodin_PartyStartingHealth
else
set udg_Herodin_PartyStartingHealth = 0
endif
//PLUG LEAKS
set lv_numRemaining = 0
endfunction
function Herodin_createGuardPositions takes nothing returns nothing
endfunction
function loAI_addPatrolLocation takes location lp_loc, string lp_patrolType returns nothing
endfunction
function udf_rootToLastLock takes nothing returns nothing
local hashtable lv_hash = udg_hashTablePathHash
local integer lv_index = 0
local string lv_saveName = udg_lastUsedRootName
local integer lv_parent = StringHashBJ("rootName")
//========================================
set lv_index = LoadIntegerBJ(StringHashBJ("indexCount"), lv_parent, lv_hash)
set lv_index = lv_index + 1
call SaveStringBJ(lv_saveName, StringHashBJ(I2S(lv_index)), lv_parent, lv_hash)
call SaveIntegerBJ(lv_index, StringHashBJ("indexCount"), lv_parent, lv_hash)
set udg_lockedRootName = lv_saveName
set udg_lockedRootNamePathInt = lv_index
endfunction
function udg_rootToLastUnlock takes nothing returns nothing
local hashtable lv_hash = udg_hashTablePathHash
local integer lv_parent = StringHashBJ("rootName")
local integer lv_index = LoadIntegerBJ(StringHashBJ("indexCount"), lv_parent, lv_hash)
local string lv_saveName = LoadStringBJ(StringHashBJ(I2S(lv_index)), lv_parent, lv_hash)
//========================================
call SaveStringBJ(null, StringHashBJ(I2S(lv_index)), lv_parent, lv_hash)
set lv_index = lv_index - 1
call SaveIntegerBJ(lv_index, StringHashBJ("indexCount"), lv_parent, lv_hash)
set udg_lockedRootName = ""
set udg_lockedRootNamePathInt = 0
endfunction
function loAI_addGuardPosition takes location lp_loc, integer lp_unitTypeInt, string lp_patrolRoute returns nothing
local integer lv_pathInt = 0
local integer lv_indexCount = 0
local integer lv_parent = StringHashBJ("guardPosition")
local hashtable lv_hash = udg_herodinGuardForceHash
set udg_tempHash = lv_hash
set udg_tempParent = lv_parent
set udg_tempRootName = ""
//=============================================================
// Add unit data to the hash
//=============================================================
call sAI_addDataToHashLocation_UT(lp_playerInt, lp_location)
call sAI_addDataToHashString_UT(lp_playerInt,"unit", "") // creates an empty for a unit - auto added to last, waiting for fill
call udf_rootToLastLock() // locks the temp root name, cannot be changed, so next addDatas will be set to this root name
call sAI_addDataToHashInteger_UT(lp_playerInt, lp_unitTypeInt)
call sAI_addDataToHashString_UT(lp_playerInt,"behavior", "guard") // need a field state add?
call udf_rootToLastUnlock()
//=============================================================
//=============================================================
endfunction
function loAI_setGuardsPeriodicCheck takes nothing returns nothing
local integer lv_herodinAIInt = udg_herodinAIInt
//these strings need to be proper unit type ids
if udg_HDxNumOfRiflemen < udg_HDxNumOfRiflemenNeeded[udg_bridgeDefenderLevel] then
udf_createHerodinDefenders("riflemen", udg_HDxNumOfRiflemenNeeded[udg_bridgeDefenderLevel] - udg_HDxNumOfRiflemen)
endif
if udg_HDxNumOfMortarTeams < udg_HDxNumOfMortarTeamsNeeded[udg_bridgeDefenderLevel] then
udf_createHerodinDefenders("mortarteam", udg_HDxNumOfMortarTeamsNeeded[udg_bridgeDefenderLevel] - udg_HDxNumOfMortarTeams)
endif
if udg_HDxNumOfWorkers < udg_HDxNumOfWorkersNeeded[udg_bridgeDefenderLevel] then
udf_createHerodinDefenders("dwarvenworker", udg_HDxNumOfWorkersNeeded[udg_bridgeDefenderLevel] - udg_HDxNumOfWorkers)
endif
// if positions are filled up, then the reinforcement just picks a unit to go stand by
// loops guard position and also sees if assigned unit is there, if unit is alive but not there, attack move to
// new unit just stands close by, unassigned until a slot opens up
if then
elseif then
else
endif
endfunction
function sAI_herodinSpells takes nothing returns nothing
local unit u = udg_Herodin
local integer closeEnemyCount = 0
local group sortGroup = CreateGroup()
local boolean processFinished = false
local unit enumUnit = null
//MAIN PART
set sortGroup = GetUnitsInRangeOfLocAll(200.00, GetUnitLoc(u))
set enumUnit = FirstOfGroup(sortGroup)
loop
exitwhen (enumUnit == null)
if (IsPlayerEnemy(GetOwningPlayer(enumUnit), (GetOwningPlayer(u))) == true) then
if (IsUnitType(enumUnit, UNIT_TYPE_STRUCTURE) == false ) then
set closeEnemyCount = closeEnemyCount + 1
endif
endif
call GroupRemoveUnitSimple(enumUnit, sortGroup)
set enumUnit = FirstOfGroup(sortGroup)
endloop
if (closeEnemyCount >= 3) then
call IssueImmediateOrderBJ( u, "thunderclap" )
endif
//PLUG LEAKS
set u = null
set closeEnemyCount = 0
call DestroyGroup(sortGroup)
set sortGroup = null
set processFinished = false
set enumUnit = null
endfunction
function sAI_herodinPlayerAI_init takes nothing returns nothing
local unit townhall = udg_herodinFirstTH
local integer p = udg_herodinPlayerID
local integer base = 1
//MAIN PART
call sAI_addBase(p, townhall)
set base = udg_sAI_lastCreatedBaseID
//Rifleman
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('h019'), 9)
//Skybarge prob
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('n00q'), 2)
//Dwarven Worker
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('h00K'), 6)
//buildings
//Dwarven Rifleman Tower (bottom piece - fix later)
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('h018'), 1)
//Dwarven AA Tower
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('h017'), 1)
//Dwarven Town Hall
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('h00S'), 1)
//Barracks
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('h00F'), 1)
//D Smithy
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('h00E'), 1)
//Altar of Kings
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('halt'), 1)
//Farm
call sAI_base_addWant_unit(p, base, UnitId2StringBJ('hhou'),8)
//PLUG LEAKS
set townhall = null
set p = 0
set base = 0
endfunction
function sAI_lilithWaveArmyData takes nothing returns nothing
local string unitTypeString = ""
local integer unitCount = 0
local unit lilith = udg_DarkRangerLilith
local string unitIDString = ""
local string armyDLS = ""
local string lilithIDString = I2S(GetHandleIdBJ(lilith))
local string uTS = ""
local integer count = 0
local string str = ""
local integer i = 0
local string iS = ""
local integer dls_i = 0
//MAIN PART
set iS = I2S(i)
set dls_i = S2I("Units_" + lilithIDString + "_army_want")
set uTS = LoadStringBJ(0, dls_i, udg_UnitAI)
set count = LoadIntegerBJ(0, dls_i, udg_UnitAI)
loop
exitwhen (uTS == "")
set dls_i = S2I("Units_" + lilithIDString + "_army_want")
set uTS = LoadStringBJ(0, dls_i, udg_UnitAI)
set count = LoadIntegerBJ(0, dls_i, udg_UnitAI)
endloop
// PLUG LEAKS
set unitTypeString = ""
set unitCount = 0
set lilith = null
set unitIDString = ""
set armyDLS = ""
set lilithIDString = ""
endfunction
function sAI_hunterDog takes unit u returns nothing
local integer unitID = GetHandleIdBJ(u)
local string unitIDString = I2S(unitID)
local unit hunter = LoadUnitHandleBJ(0, StringHashBJ("Units_" + unitIDString + "_hunter"), udg_UnitAI)
local string hunterIDString = I2S(GetHandleIdBJ(hunter))
local unit hunterTarget = LoadUnitHandleBJ(0, StringHashBJ("Units_" + hunterIDString + "_currentTarget"), udg_UnitAI) // this requires some attack input
local location dogAttackPoint = GetUnitLoc(hunterTarget)
local location randPoint = PolarProjectionBJ(GetUnitLoc(hunter), 256, GetRandomDirectionDeg())
//local timer dogDecisionWait = null
if (hunterTarget != null) then
call IssueTargetOrderBJ( u, "attack", hunterTarget )
else
call IssuePointOrderLocBJ( u, "attack", dogAttackPoint )
endif
//PLUG LEAKS
set unitID = 0
set unitIDString = ""
set hunter = null
set hunterIDString = ""
set hunterTarget = null
call RemoveLocation(dogAttackPoint)
set dogAttackPoint = null
call RemoveLocation(randPoint)
set randPoint = null
endfunction
function Trig_Hunter_Dies_Conditions takes nothing returns boolean
if ( not ( GetUnitTypeId(GetDyingUnit()) == 'n006' ) ) then
return false
endif
return true
endfunction
function Trig_Hunter_Dies_Actions takes nothing returns nothing
local string hunterIDString = I2S(GetHandleIdBJ(GetDyingUnit()))
local integer dls_i = StringHashBJ("Units_" + hunterIDString + "_hunter")
local unit pet = LoadUnitHandleBJ(0, dls_i, udg_UnitAI)
//==============================================
//MAIN PART
//==============================================
call KillUnit(pet)
//==============================================
//PLUG LEAKS
//==============================================
set hunterIDString = ""
set dls_i = 0
set pet = null
endfunction
//===========================================================================
function InitTrig_Hunter_Dies takes nothing returns nothing
set gg_trg_Hunter_Dies = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Hunter_Dies, EVENT_PLAYER_UNIT_DEATH )
call TriggerAddCondition( gg_trg_Hunter_Dies, Condition( function Trig_Hunter_Dies_Conditions ) )
call TriggerAddAction( gg_trg_Hunter_Dies, function Trig_Hunter_Dies_Actions )
endfunction
function Trig_Unit_Acquires_Target_x_General_Actions takes nothing returns nothing
local unit u = GetOrderedUnit()
local string unitIDString = I2S(GetHandleIdBJ(u))
local integer dls_i = StringHashBJ("Units_" + unitIDString + "_currentTarget")
//MAIN PART
call SaveUnitHandleBJ(GetOrderTargetUnit(), 0, dls_i, udg_UnitAI)
//PLUG LEAKS
set u = null
set unitIDString = ""
set dls_i = 0
endfunction
//===========================================================================
function InitTrig_Unit_Acquires_Target_x_General takes nothing returns nothing
set gg_trg_Unit_Acquires_Target_x_General = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Unit_Acquires_Target_x_General, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )
call TriggerAddAction( gg_trg_Unit_Acquires_Target_x_General, function Trig_Unit_Acquires_Target_x_General_Actions )
endfunction
function Trig_Unit_Unacquires_Target_x_General_Actions takes nothing returns nothing
local unit u = GetOrderedUnit()
local string unitIDString = I2S(GetHandleIdBJ(u))
local integer dls_i = StringHashBJ("Units_" + unitIDString + "_currentTarget")
//MAIN PART
call SaveUnitHandleBJ(null, 0, dls_i, udg_UnitAI)
//PLUG LEAKS
set u = null
set unitIDString = ""
set dls_i = 0
endfunction
//===========================================================================
function InitTrig_Unit_Unacquires_Target_x_General takes nothing returns nothing
set gg_trg_Unit_Unacquires_Target_x_General = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Unit_Unacquires_Target_x_General, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Unit_Unacquires_Target_x_General, EVENT_PLAYER_UNIT_ISSUED_ORDER )
call TriggerAddAction( gg_trg_Unit_Unacquires_Target_x_General, function Trig_Unit_Unacquires_Target_x_General_Actions )
endfunction
function sAI_saveUnitToHash takes unit u returns nothing
local string uIS = I2S(GetHandleIdBJ(u))
//MAIN PART
call sAI_saveUnitParameter(u, "unit", "Units_" + uIS, udg_UnitAI)
//PLUG LEAKS
set uIS = ""
endfunction
function sAI_unitStopBuilding takes unit u returns nothing
local unit trainer = u
local string trainerTypeS = UnitId2StringBJ(GetUnitTypeId(trainer)) // As opposed to a handle which doesn't exist cos it's a unit type, not a unit.
local string trainerIDString = I2S(GetHandleIdBJ(trainer))
local string str = ""
local integer p = GetConvertedPlayerId(GetOwningPlayer(trainer))
local string playerIDString = I2S(p)
local integer baseID = 0 //get from trainer
local string baseIDString = ""
local integer count = 0
local string cBIS = ""
local unit cB = null // currently building
local string cBTS = ""
local string bOrdString = null
//MAIN PART
//GET ID VARIABLES
set baseIDString = I2S(LoadIntegerBJ(0, StringHashBJ("Units_" + trainerIDString + "_baseID"), udg_UnitAI))
set cB = LoadUnitHandleBJ(0, StringHashBJ("Units_" + trainerIDString + "_currentlyBuilding_unit"), udg_UnitAI)
set cBTS = LoadStringBJ(0, StringHashBJ("Units_" + trainerIDString + "_currentlyBuilding_unitType"), udg_UnitAI) // maybe update to "unitTypeString"
//call IssueImmediateOrderBJ(u, "stop")
call sAI_saveUnitParameter(null, "currentlyBuilding_unit", "Units_" + trainerIDString, udg_UnitAI)
call sAI_saveLocationParameter(null, "currentlyBuilding_location", "Units_" + trainerIDString, udg_UnitAI)
call sAI_saveStringParameter("", "currentlyBuilding_unitType", "Units_" + trainerIDString, udg_UnitAI)
set str = "Player_" + playerIDString + "_base_" + baseIDString
call GroupRemoveUnit(LoadGroupHandleBJ(0, StringHashBJ(str + "_builders"), udg_PlayerAI[p]), trainer)
call GroupAddUnit(LoadGroupHandleBJ(0, StringHashBJ(str + "_workers_idle"), udg_PlayerAI[p]), trainer)
set str = "Player_" + playerIDString + "_base_" + baseIDString
set count = LoadIntegerBJ(0, StringHashBJ(str + "_has_building_" + cBTS + "_count"), udg_PlayerAI[p])
set count = count - 1
call SaveIntegerBJ(count, 0, StringHashBJ(str + "_has_building_" + cBTS + "_count"), udg_PlayerAI[p])
//"has building" applies even to a structure that has begun construction, they are not considered "has" until complete
//PLUG LEAKS
set trainer = null
set trainerTypeS = ""
set trainerIDString = ""
set str = ""
set p = 0
set playerIDString = ""
set baseID = 0
set baseIDString = ""
set count = 0
set cBIS = ""
set cB = null
set cBTS = ""
set bOrdString = null
endfunction
function sAI_cancelConstruction takes unit u returns nothing
call IssueImmediateOrderById(u, 851976)
endfunction
function sAI_startException takes unit u returns nothing
local string unitIDString = I2S(GetHandleIdBJ(u))
//MAIN PART
call sAI_saveBooleanParameter(true, "loopException", "Units_" + unitIDString, udg_UnitAI)
//PLUG LEAKS
set unitIDString = ""
endfunction
function sAI_endException takes unit u returns nothing
local string unitIDString = I2S(GetHandleIdBJ(u))
//MAIN PART
call sAI_saveBooleanParameter(false, "loopException", "Units_" + unitIDString, udg_UnitAI)
//PLUG LEAKS
set unitIDString = ""
endfunction
function Trig_PlayerAI_x_Base_Attacked_Actions takes nothing returns nothing
local string unitIDString = I2S(GetHandleId(GetAttackedUnitBJ()))
local integer p = GetConvertedPlayerId(GetOwningPlayer(GetAttackedUnitBJ()))
local string playerIDString = I2S(p)
local string bIS = I2S(LoadIntegerBJ(0, StringHashBJ("Units_" + unitIDString + "_baseID"), udg_UnitAI))
local group g = CreateGroup()
local unit enumUnit = null
local location loc = GetUnitLoc(GetAttackedUnitBJ())
//======================================================
if (IsUnitType(GetAttackedUnitBJ(), UNIT_TYPE_STRUCTURE) == true) then
set udg_tempGroup = LoadGroupHandleBJ(0, StringHashBJ("Player_" + playerIDString + "_base_" + bIS + "_army"), udg_PlayerAI[p])
call sAI_saveUnitParameter(GetAttackedUnitBJ(), "lastAttackedBuilding", "Player_" + playerIDString + "_base_" + bIS, udg_PlayerAI[p])
call GroupAddGroup(udg_tempGroup, g)
set enumUnit = FirstOfGroup(g)
loop
exitwhen (enumUnit == null)
call IssuePointOrderLoc(enumUnit, "attack", loc)
call GroupRemoveUnit(g, enumUnit)
set enumUnit = FirstOfGroup(g)
endloop
endif
// //======================================================
call DestroyGroup(g)
call RemoveLocation(loc)
set g = null
set unitIDString = ""
set p = 0
set playerIDString = ""
set bIS = ""
set enumUnit = null
set loc = null
endfunction
//===========================================================================
function InitTrig_PlayerAI_x_Base_Attacked takes nothing returns nothing
set gg_trg_PlayerAI_x_Base_Attacked = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_PlayerAI_x_Base_Attacked, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddAction( gg_trg_PlayerAI_x_Base_Attacked, function Trig_PlayerAI_x_Base_Attacked_Actions )
endfunction
function Trig_PlayerAI_x_Construction_Finishes_Actions takes nothing returns nothing
local unit trainer = GetTriggerUnit() //invalid i tink
local unit u = GetConstructedStructure()
local string unitIDString = I2S(GetHandleIdBJ(u))
local string trainerTypeS = UnitId2StringBJ(GetUnitTypeId(trainer))
local string trainerIDString = I2S(GetHandleIdBJ(trainer))
local string str = ""
local integer dls_i = 0
local string tIS = "" // train indec string
local integer trainIndex = 0
local integer tIC = 0
local integer p = GetConvertedPlayerId(GetOwningPlayer(trainer))
local string playerIDString = I2S(p)
local integer baseID = 0 //get from trainer
local string baseIDString = ""
local group baseArmy = null
local integer count = 0
local string uTS = UnitId2StringBJ(GetUnitTypeId(u))
//new
local group sortGroup = CreateGroup()
//MAIN PART
//call AddSpecialEffectLocBJ( GetUnitLoc(trainer), "Abilities\\Spells\\Human\\HolyBolt\\HolyBoltSpecialArt.mdl" )
//call DestroyEffectBJ( GetLastCreatedEffectBJ() )
call sAI_saveUnitParameter(null, "currentlyBuilding_unit", "Units_" + trainerIDString, udg_UnitAI)
call sAI_saveLocationParameter(null, "currentlyBuilding_location", "Units_" + trainerIDString, udg_UnitAI)
call sAI_saveStringParameter("", "currentlyBuilding_unitType", "Units_" + trainerIDString, udg_UnitAI)
// ASSIGN BASE
call sAI_assignNearbyBaseToUnit(p, u) // Just whatever zone it's actually built in. Otherwise default to 0.
//call sAI_baseAddUnit(p, baseID, u)
// don't need to add terms
//GET BASE ID
set str = "Units_" + unitIDString + "_baseID"
set baseID = LoadIntegerBJ(0, StringHashBJ(str), udg_UnitAI)
set baseIDString = I2S(baseID)
//GET BUILDERS
// UPDATE TRAINING COUNT
set str = "Player_" + playerIDString + "_base_" + baseIDString
call GroupRemoveUnit(LoadGroupHandleBJ(0, StringHashBJ(str + "_builders"), udg_PlayerAI[p]), trainer)
call GroupRemoveUnit(LoadGroupHandleBJ(0, StringHashBJ(str + "_isBuilding"), udg_UnitAI), u)
set count = LoadIntegerBJ(0, StringHashBJ(str + "_has_building_" + uTS + "_count"), udg_PlayerAI[p])
set count = count - 1
call SaveIntegerBJ(count, 0, StringHashBJ(str + "_has_building_" + uTS + "_count"), udg_PlayerAI[p])
//PLUG LEAKS
set trainer = null
set u = null
set unitIDString = ""
set trainerTypeS = ""
set trainerIDString = ""
set str = ""
set dls_i = 0
set tIS = ""
set trainIndex = 0
set tIC = 0
set p = 0
set playerIDString = ""
set baseID = 0
set baseIDString = ""
set baseArmy = null
set count = 0
set uTS = ""
endfunction
//===========================================================================
function InitTrig_PlayerAI_x_Construction_Finishes takes nothing returns nothing
set gg_trg_PlayerAI_x_Construction_Finishes = CreateTrigger( )
call DisableTrigger( gg_trg_PlayerAI_x_Construction_Finishes )
call TriggerRegisterAnyUnitEventBJ( gg_trg_PlayerAI_x_Construction_Finishes, EVENT_PLAYER_UNIT_CONSTRUCT_FINISH )
call TriggerAddAction( gg_trg_PlayerAI_x_Construction_Finishes, function Trig_PlayerAI_x_Construction_Finishes_Actions )
endfunction
function Trig_PlayerAI_x_Construction_Queued_2_Conditions takes nothing returns boolean
if ( not ( IsUnitIdType(String2UnitIdBJ(OrderId2StringBJ(GetIssuedOrderIdBJ())), UNIT_TYPE_STRUCTURE) == true ) ) then
return false
endif
if ( not ( String2UnitIdBJ(OrderId2StringBJ(GetIssuedOrderIdBJ())) != 0 ) ) then
return false
endif
return true
endfunction
function Trig_PlayerAI_x_Construction_Queued_2_Actions takes nothing returns nothing
local integer ord = GetIssuedOrderIdBJ()
//
local unit trainer = GetOrderedUnit()
local string orderString = OrderId2StringBJ(GetIssuedOrderIdBJ())
local string trainerTypeS = UnitId2StringBJ(GetUnitTypeId(trainer)) // As opposed to a handle which doesn't exist cos it's a unit type, not a unit.
local string trainerIDString = I2S(GetHandleIdBJ(trainer))
local string str = ""
local integer dls_i = 0
local string tIS = "" // train index string
local integer trainIndex = 0
local integer tIC = 0
local integer p = GetConvertedPlayerId(GetOwningPlayer(trainer))
local string playerIDString = I2S(p)
local integer baseID = 0 //get from trainer
local string baseIDString = ""
local integer count = 0
//new
local location orderLoc = GetOrderPointLoc()
local timer newTimer = LoadTimerHandleBJ(0, StringHashBJ("Units_" + trainerIDString + "_currentlyBuilding_timer"), udg_UnitAI)
//MAIN PART
//call AddSpecialEffectLocBJ( GetUnitLoc(trainer), "Abilities\\Spells\\Human\\HolyBolt\\HolyBoltSpecialArt.mdl" )
//call DestroyEffectBJ( GetLastCreatedEffectBJ() )
//call DisplayTextToForce( GetPlayersAll(), "queued" )
set trainerIDString = I2S(GetHandleIdBJ(trainer))
//Get Base Id
set str = "Units_" + trainerIDString + "_baseID"
set dls_i = StringHashBJ(str)
set baseID = LoadIntegerBJ(0, dls_i, udg_UnitAI)
set baseIDString = I2S(baseID)
//Save Unit Type Being Constructed
call sAI_saveStringParameter(orderString, "currentlyBuilding_unitType", "Units_" + trainerIDString, udg_UnitAI)
call sAI_saveLocationParameter(orderLoc, "currentlyBuilding_location", "Units_" + trainerIDString, udg_UnitAI)
if (newTimer == null) then
set newTimer = CreateTimer()
endif
call sAI_saveTimerParameter(newTimer, "currentlyBuilding_timer", "Units_" + trainerIDString, udg_UnitAI)
if (TimerGetRemaining(newTimer) <= 0.0) then
call StartTimerBJ(newTimer, false, 20)
endif
set str = "Player_" + playerIDString + "_base_" + baseIDString
call GroupAddUnitSimple(trainer, LoadGroupHandleBJ(0, StringHashBJ(str + "_builders"), udg_PlayerAI[p]))
call GroupRemoveUnit(LoadGroupHandleBJ(0, StringHashBJ(str + "_harvesters"), udg_PlayerAI[p]), trainer)
// the following adds Terms
//call sAI_addUnitTrainingKnowledge(GetConvertedPlayerId(GetOwningPlayer(trainer)), UnitId2StringBJ(GetUnitTypeId(trainer)), orderString)
// update training count
call sAI_saveBooleanParameter(true, orderString, str + "_has_building", udg_PlayerAI[p])
set count = LoadIntegerBJ(0, StringHashBJ(str + "_has_building_" + orderString + "_count"), udg_PlayerAI[p])
set count = count + 1
call sAI_saveIntegerParameter(count, "count", str + "_has_building_" + orderString, udg_PlayerAI[p])
//PLUG LEAKS
set ord = 0
set trainer = null
set orderString = ""
set trainerTypeS = ""
set trainerIDString = ""
set str = ""
set dls_i = 0
set tIS = ""
set trainIndex = 0
set tIC = 0
set p = 0
set playerIDString = ""
set baseID = 0
set baseIDString = ""
set count = 0
set orderLoc = null //it's being saved to data
endfunction
//===========================================================================
function InitTrig_PlayerAI_x_Construction_Queued_2 takes nothing returns nothing
set gg_trg_PlayerAI_x_Construction_Queued_2 = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_PlayerAI_x_Construction_Queued_2, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
call TriggerRegisterAnyUnitEventBJ( gg_trg_PlayerAI_x_Construction_Queued_2, EVENT_PLAYER_UNIT_ISSUED_ORDER )
call TriggerAddCondition( gg_trg_PlayerAI_x_Construction_Queued_2, Condition( function Trig_PlayerAI_x_Construction_Queued_2_Conditions ) )
call TriggerAddAction( gg_trg_PlayerAI_x_Construction_Queued_2, function Trig_PlayerAI_x_Construction_Queued_2_Actions )
endfunction
function Trig_PlayerAI_x_Construction_Starts_Conditions takes nothing returns boolean
return true
endfunction
function Trig_PlayerAI_x_Construction_Starts_Actions takes nothing returns nothing
local integer ord = GetIssuedOrderIdBJ()
//
local unit trainer = GetTriggerUnit()
local unit u = GetConstructingStructure()
local string orderString = OrderId2StringBJ(GetIssuedOrderIdBJ())
local string trainerTypeS = UnitId2StringBJ(GetUnitTypeId(trainer)) // As opposed to a handle which doesn't exist cos it's a unit type, not a unit.
local string trainerIDString = I2S(GetHandleIdBJ(trainer))
local string str = ""
local integer dls_i = 0
local string tIS = "" // train index string
local integer trainIndex = 0
local integer tIC = 0
local integer p = GetConvertedPlayerId(GetOwningPlayer(trainer))
local string playerIDString = I2S(p)
local integer baseID = 0 //get from trainer
local string baseIDString = ""
local integer count = 0
//new
local location orderLoc = GetOrderPointLoc()
local string cBIS = ""
local unit cB = null // currently building
//MAIN PART
//call AddSpecialEffectLocBJ( GetUnitLoc(trainer), "Abilities\\Spells\\Human\\HolyBolt\\HolyBoltSpecialArt.mdl" )
//call DestroyEffectBJ( GetLastCreatedEffectBJ() )
call sAI_saveUnitToHash(u)
call sAI_saveUnitParameter(u, "currentlyBuilding_unit", "Units_" + trainerIDString, udg_UnitAI)
call GroupAddUnitSimple(u, LoadGroupHandleBJ(0, StringHashBJ("Player_" + playerIDString + "_base_" + baseIDString + "_isBuilding"), udg_UnitAI))
call GroupAddUnitSimple(u, LoadGroupHandleBJ(0, StringHashBJ("Player_" + playerIDString + "_base_" + baseIDString + "_group"), udg_UnitAI))
//PLUG LEAKS
set ord = 0
set trainer = null
set orderString = ""
set trainerTypeS = ""
set trainerIDString = ""
set str = ""
set dls_i = 0
set tIS = ""
set trainIndex = 0
set tIC = 0
set p = 0
set playerIDString = ""
set baseID = 0
set baseIDString = ""
set count = 0
set orderLoc = null //it's being save to data
endfunction
//===========================================================================
function InitTrig_PlayerAI_x_Construction_Starts takes nothing returns nothing
set gg_trg_PlayerAI_x_Construction_Starts = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_PlayerAI_x_Construction_Starts, EVENT_PLAYER_UNIT_CONSTRUCT_START )
call TriggerAddCondition( gg_trg_PlayerAI_x_Construction_Starts, Condition( function Trig_PlayerAI_x_Construction_Starts_Conditions ) )
call TriggerAddAction( gg_trg_PlayerAI_x_Construction_Starts, function Trig_PlayerAI_x_Construction_Starts_Actions )
endfunction
function Trig_Player_x_Construction_Unqueued_Conditions takes nothing returns boolean
if ( ( String2UnitIdBJ(OrderId2StringBJ(GetIssuedOrderIdBJ())) != 0 ) ) then
return false
endif
return true
endfunction
function Trig_Player_x_Construction_Unqueued_Actions takes nothing returns nothing
local integer ord = GetIssuedOrderIdBJ()
//
local unit trainer = GetOrderedUnit()
local string orderString = OrderId2StringBJ(GetIssuedOrderIdBJ())
local string trainerTypeS = UnitId2StringBJ(GetUnitTypeId(trainer)) // As opposed to a handle which doesn't exist cos it's a unit type, not a unit.
local string trainerIDString = I2S(GetHandleIdBJ(trainer))
local string str = ""
local integer dls_i = 0
local string tIS = "" // train index string
local integer trainIndex = 0
local integer tIC = 0
local integer p = GetConvertedPlayerId(GetOwningPlayer(trainer))
local string playerIDString = I2S(p)
local integer baseID = 0 //get from trainer
local string baseIDString = ""
local integer count = 0
//new
local location orderLoc = GetOrderPointLoc()
local string cBIS = ""
local unit cB = null // currently building
local string cBTS = ""
local string bOrdString = null
local location loc = null
local timer t = LoadTimerHandleBJ(0, StringHashBJ("Units_" + trainerIDString + "_currentlyBuilding_timer"), udg_UnitAI)
local unit transport = LoadUnitHandleBJ(0, StringHashBJ("Units_" + trainerIDString + "_currentlyBuilding_timer"), udg_UnitAI)
local boolean unitIsBuilding = false
local boolean loopException = false
local unit targetUnit = GetOrderTargetUnit()
//MAIN PART
if (orderString == "repair" ) then
call sAI_saveUnitParameter(targetUnit, "currentlyBuilding_unit", "Units_" + trainerIDString, udg_UnitAI)
//integrate this with next part so building will remove it from its b group if this is a new building it's instructed to build
endif
//GET ID VARIABLES
set baseIDString = I2S(LoadIntegerBJ(0, StringHashBJ("Units_" + trainerIDString + "_baseID"), udg_UnitAI))
set cB = LoadUnitHandleBJ(0, StringHashBJ("Units_" + trainerIDString + "_currentlyBuilding_unit"), udg_UnitAI)
set cBTS = LoadStringBJ(0, StringHashBJ("Units_" + trainerIDString + "_currentlyBuilding_unitType"), udg_UnitAI) // maybe update to "unitTypeString"
set loc = LoadLocationHandleBJ(0, StringHashBJ("Units_" + trainerIDString + "_currentlyBuilding_location"), udg_UnitAI)
set loopException = LoadBooleanBJ(0, StringHashBJ("Units_" + trainerIDString + "_loopException"), udg_UnitAI)
set str = "Player_" + playerIDString + "_base_" + baseIDString
if ((IsUnitInGroup(trainer, LoadGroupHandleBJ(0, StringHashBJ(str + "_builders"), udg_PlayerAI[p])) == true) and (loopException == false)) then
if (TimerGetRemaining(t) <= 0.0) then
if (cB != null) then
//call StartTimerBJ(t, false, 20.0)
//call IssuePointOrderLocBJ( trainer, "move", loc) // avoid infinite murozond loop, might need another timer
//call sAI_cancelConstruction(cB)
else
call sAI_unitStopBuilding(trainer)
endif
else
if (cBTS != "") then
if (cB != null) then
//call IssueTargetOrder(trainer, "smart", cB) // actually need it to repair, not build new unit, maybe this smart commands it?
call sAI_startException(trainer)
//call IssueTargetOrder(trainer, "repair", cB) // test // does this create infinite loop? i think it does
call sAI_endException(trainer)
//call sAI_cancelConstruction(cB)
//call DisplayTextToForce( GetPlayersAll(), "requeue" )
else
set str = "Player_" + playerIDString + "_base_" + baseIDString
//set count = LoadIntegerBJ(0, StringHashBJ(str + "_has_building_" + cBTS + "_count"), udg_PlayerAI[p])
//set count = count - 1
//call SaveIntegerBJ(count, 0, StringHashBJ(str + "_has_building_" + cBTS + "_count"), udg_PlayerAI[p])
//because it reissues and +counts
// test
call sAI_startException(trainer)
//call IssuePointOrderLocBJ( trainer, cBTS, loc)
call sAI_endException(trainer)
//call DisplayTextToForce( GetPlayersAll(), "requeue" )
endif
endif
endif
endif // Of Unit Is Builder
//PLUG LEAKS
set ord = 0
set trainer = null
set orderString = ""
set trainerTypeS = ""
set trainerIDString = ""
set str = ""
set dls_i = 0
set tIS = ""
set trainIndex = 0
set tIC = 0
set p = 0
set playerIDString = ""
set baseID = 0
set baseIDString = ""
set count = 0
set orderLoc = null //it's being saved to data
endfunction
//===========================================================================
function InitTrig_Player_x_Construction_Unqueued takes nothing returns nothing
set gg_trg_Player_x_Construction_Unqueued = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Player_x_Construction_Unqueued, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Player_x_Construction_Unqueued, EVENT_PLAYER_UNIT_ISSUED_ORDER )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Player_x_Construction_Unqueued, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )
call TriggerAddCondition( gg_trg_Player_x_Construction_Unqueued, Condition( function Trig_Player_x_Construction_Unqueued_Conditions ) )
call TriggerAddAction( gg_trg_Player_x_Construction_Unqueued, function Trig_Player_x_Construction_Unqueued_Actions )
endfunction
function Trig_PlayerAI_x_Construction_Cancelled_2_Actions takes nothing returns nothing
local unit trainer = GetTriggerUnit()
local string orderString = UnitId2StringBJ(GetUnitTypeId(GetCancelledStructure()))
local string trainerTypeS = UnitId2StringBJ(GetUnitTypeId(trainer)) // As opposed to a handle which doesn't exist cos it's a unit type, not a unit.
local string trainerIDString = I2S(GetHandleIdBJ(trainer))
local string str = ""
local integer dls_i = 0
local string tIS = "" // train index string
local integer trainIndex = 0
local integer tIC = 0
local integer p = GetConvertedPlayerId(GetOwningPlayer(trainer))
local string playerIDString = I2S(p)
local integer baseID = 0 //get from trainer
local string baseIDString = ""
local integer count = 0
local unit u = GetCancelledStructure()
local string unitIDString = I2S(GetHandleIdBJ(u))
local group builderGroup = LoadGroupHandleBJ(0, StringHashBJ("Units_" + unitIDString + "_builderGroup"), udg_UnitAI)
local group sortGroup = CreateGroup()
local unit enumUnit = null
//MAIN PART
call sAI_saveUnitParameter(null, "currentlyBuilding_unit", "Units_" + trainerIDString, udg_UnitAI)
//Get Base Id
set str = "Units_" + trainerIDString + "_baseID"
set dls_i = StringHashBJ(str)
set baseID = LoadIntegerBJ(0, dls_i, udg_UnitAI)
set baseIDString = I2S(baseID)
//STOP ALL WORKERS
call GroupAddGroup(builderGroup, sortGroup)
set enumUnit = FirstOfGroup(sortGroup)
loop
exitwhen (enumUnit == null)
//call sAI_unitStopBuilding // removes all its building data
call GroupRemoveUnit(sortGroup, enumUnit)
set enumUnit = FirstOfGroup(sortGroup)
endloop
//I think builder group gets automatically cleared by delete data func, at least it SHOULD
//REMOVE CANCELLED BUILDING FROM GROUP (Redundant?)
call GroupRemoveUnit(LoadGroupHandleBJ(0, StringHashBJ(str + "_isBuilding"), udg_PlayerAI[p]), u)
// UPDATE BUILDING COUNT
set str = "Player_" + playerIDString + "_base_" + baseIDString
set count = LoadIntegerBJ(0, StringHashBJ(str + "_has_building_" + orderString + "_count"), udg_PlayerAI[p])
set count = count - 1
call SaveIntegerBJ(count, 0, StringHashBJ(str + "_has_building_" + orderString + "_count"), udg_PlayerAI[p])
//PLUG LEAKS
call DestroyGroup(sortGroup)
set trainer = null
set orderString = ""
set trainerTypeS = ""
set trainerIDString = ""
set str = ""
set dls_i = 0
set tIS = ""
set trainIndex = 0
set tIC = 0
set p = 0
set playerIDString = ""
set baseID = 0
set baseIDString = ""
set count = 0
set u = null
set unitIDString = ""
set builderGroup = null
set sortGroup = null
set enumUnit = null
endfunction
//===========================================================================
function InitTrig_PlayerAI_x_Construction_Cancelled_2 takes nothing returns nothing
set gg_trg_PlayerAI_x_Construction_Cancelled_2 = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_PlayerAI_x_Construction_Cancelled_2, EVENT_PLAYER_UNIT_CONSTRUCT_CANCEL )
call TriggerAddAction( gg_trg_PlayerAI_x_Construction_Cancelled_2, function Trig_PlayerAI_x_Construction_Cancelled_2_Actions )
endfunction
function Trig_PlayerAI_x_Building_Queues_Training_Conditions takes nothing returns boolean
if ( String2UnitIdBJ(OrderId2StringBJ(GetIssuedOrderIdBJ())) != 0 ) then
return true
endif
return false
endfunction
//==============================================================================================
function Trig_PlayerAI_x_Building_Queues_Training_Actions takes nothing returns nothing
local unit trainer = GetOrderedUnit()
local string orderString = OrderId2StringBJ(GetIssuedOrderIdBJ())
local string trainerTypeS = UnitId2StringBJ(GetUnitTypeId(trainer))
local string trainerIDString = I2S(GetHandleIdBJ(trainer))
local string str = ""
local integer dls_i = 0
local string tIS = "" // train index string
local integer trainIndex = 0
local integer tIC = 0
local integer p = GetConvertedPlayerId(GetOwningPlayer(trainer))
local string playerIDString = I2S(p)
local integer baseID = 0 //get from trainer
local string baseIDString = ""
local integer count = 0
//MAIN PART
if (p == udg_herodinPlayerID) then
//call DisplayTextToForce( GetPlayersAll(), "training queue order: " + orderString )
endif
//debug
// call AddSpecialEffectLocBJ( GetUnitLoc(trainer), "Abilities\\Spells\\Human\\HolyBolt\\HolyBoltSpecialArt.mdl" )
// call DestroyEffectBJ( GetLastCreatedEffectBJ() )
//Get Base Id
set str = "Units_" + trainerIDString + "_baseID"
set baseID = LoadIntegerBJ(0, StringHashBJ(str), udg_UnitAI)
//set baseID = 1 //debug
set baseIDString = I2S(baseID)
set str = "Player_" + playerIDString + "_base_" + baseIDString
// the following adds Terms
//call sAI_addUnitTrainingKnowledge(GetConvertedPlayerId(GetOwningPlayer(trainer)), UnitId2StringBJ(GetUnitTypeId(trainer)), orderString)
// update training count
call sAI_saveBooleanParameter(true, orderString, str + "_has_building", udg_PlayerAI[p])
set count = LoadIntegerBJ(0, StringHashBJ(str + "_has_building_" + orderString + "_count"), udg_PlayerAI[p])
set count = count + 1
call sAI_saveIntegerParameter(count, "count", str + "_has_building_" + orderString, udg_PlayerAI[p])
if (p == udg_herodinPlayerID) then
//call DisplayTextToForce( GetPlayersAll(), "training queue count: " + I2S(count) )
//call DisplayTextToForce( GetPlayersAll(), "queued unit: " + orderString )
//call DisplayTextToForce( GetPlayersAll(), "dls: " + str + "_has_building_" + orderString + "_count" )
endif
//UPDATE TRAINER INFO
set str = "Units_" + trainerIDString
call sAI_saveBooleanParameter(true, "isTrainer", str, udg_PlayerAI[p])
call sAI_saveBooleanParameter(true, "training", str, udg_PlayerAI[p])
call sAI_saveBooleanParameter(true, orderString, str + "_training", udg_PlayerAI[p])
call sAI_setDataNameMetaType("unitTypeString", udg_lastSavedParameterLocString, udg_PlayerAI[p])
set count = LoadIntegerBJ(0, StringHashBJ(str + "_training_" + orderString + "_count"), udg_PlayerAI[p])
set count = count + 1
call sAI_saveIntegerParameter(count, "count", str + "_training_" + orderString, udg_PlayerAI[p])
//PLUG LEAKS
set trainer = null
set orderString = ""
set trainerTypeS = ""
set trainerIDString = ""
set str = ""
set dls_i = 0
set tIS = ""
set trainIndex = 0
set tIC = 0
set p = 0
set playerIDString = ""
set baseID = 0
set baseIDString = ""
set count = 0
endfunction
//===========================================================================
//TRIGGER INIT
//===========================================================================
function InitTrig_PlayerAI_x_Building_Queues_Training takes nothing returns nothing
set gg_trg_PlayerAI_x_Building_Queues_Training = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_PlayerAI_x_Building_Queues_Training, EVENT_PLAYER_UNIT_ISSUED_ORDER )
call TriggerAddCondition( gg_trg_PlayerAI_x_Building_Queues_Training, Condition( function Trig_PlayerAI_x_Building_Queues_Training_Conditions ) )
call TriggerAddAction( gg_trg_PlayerAI_x_Building_Queues_Training, function Trig_PlayerAI_x_Building_Queues_Training_Actions )
endfunction
function Trig_PlayerAI_x_Building_Finishes_Training_2_Actions takes nothing returns nothing
local unit trainer = GetTriggerUnit()
local unit u = GetTrainedUnit()
local string unitIDString = I2S(GetHandleIdBJ(u))
local string trainerTypeS = UnitId2StringBJ(GetUnitTypeId(trainer))
local string trainerIDString = I2S(GetHandleIdBJ(trainer))
local string str = ""
local integer dls_i = 0
local string tIS = "" // train indec string
local integer trainIndex = 0
local integer tIC = 0
local integer p = GetConvertedPlayerId(GetOwningPlayer(trainer))
local string playerIDString = I2S(GetConvertedPlayerId(GetOwningPlayer(trainer)))
local integer baseID = 0 //get from trainer
local string baseIDString = ""
local group baseArmy = null
local integer count = 0
local string uTS = UnitId2StringBJ(GetUnitTypeId(u))
//MAIN PART
//debug
//call AddSpecialEffectLocBJ( GetUnitLoc(trainer), "Abilities\\Spells\\Human\\HolyBolt\\HolyBoltSpecialArt.mdl" )
//call DestroyEffectBJ( GetLastCreatedEffectBJ() )
//SAVE UNIT ID
call sAI_saveUnitToHash(u)
//GET BASE ID
set str = "Units_" + trainerIDString + "_baseID"
set baseID = LoadIntegerBJ(0, StringHashBJ(str), udg_UnitAI)
set baseIDString = I2S(baseID)
// ASSIGN BASE
call sAI_assignBaseToUnit(p, baseID, u)
// don't need to add terms
// UPDATE TRAINING COUNT
set str = "Player_" + playerIDString + "_base_" + baseIDString
set count = LoadIntegerBJ(0, StringHashBJ(str + "_has_building_" + uTS + "_count"), udg_PlayerAI[p])
set count = count - 1
call sAI_saveIntegerParameter(count, "count", str + "_has_building_" + uTS, udg_PlayerAI[p])
//If it's in baseID 0, then training data was still added and needs to be removed.
//UPDATE TRAINER INFO
set str = "Units_" + trainerIDString
call sAI_saveBooleanParameter(true, "training", str, udg_PlayerAI[p])
call sAI_saveBooleanParameter(true, uTS, str + "_training", udg_PlayerAI[p])
set count = LoadIntegerBJ(0, StringHashBJ(str + "_training_" + uTS + "_count"), udg_PlayerAI[p])
set count = count - 1
call sAI_saveIntegerParameter(count, "count", str + "_training_" + uTS, udg_PlayerAI[p])
//PLUG LEAKS
set trainer = null
set u = null
set unitIDString = ""
set trainerTypeS = ""
set trainerIDString = ""
set str = ""
set dls_i = 0
set tIS = ""
set trainIndex = 0
set tIC = 0
set p = 0
set playerIDString = ""
set baseID = 0
set baseIDString = ""
set baseArmy = null
set count = 0
set uTS = ""
endfunction
//===========================================================================
function InitTrig_PlayerAI_x_Building_Finishes_Training_2 takes nothing returns nothing
set gg_trg_PlayerAI_x_Building_Finishes_Training_2 = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_PlayerAI_x_Building_Finishes_Training_2, EVENT_PLAYER_UNIT_TRAIN_FINISH )
call TriggerAddAction( gg_trg_PlayerAI_x_Building_Finishes_Training_2, function Trig_PlayerAI_x_Building_Finishes_Training_2_Actions )
endfunction
function Trig_PlayerAI_x_Building_Cancels_Training_2_Actions takes nothing returns nothing
local string unitIDString = ""
local unit trainer = GetTriggerUnit()
local string orderString = UnitId2StringBJ(GetTrainedUnitType())
local string trainerTypeS = UnitId2StringBJ(GetUnitTypeId(trainer)) // As opposed to a handle which doesn't exist cos it's a unit type, not a unit.
local string trainerIDString = I2S(GetHandleIdBJ(trainer))
local string str = ""
local integer dls_i = 0
local string tIS = "" // train index string
local integer trainIndex = 0
local integer tIC = 0
local integer p = GetConvertedPlayerId(GetOwningPlayer(trainer))
local string playerIDString = I2S(GetConvertedPlayerId(GetOwningPlayer(trainer)))
local integer baseID = 0 //get from trainer
local string baseIDString = ""
local integer count = 0
//MAIN PART
//Get Base Id
set str = "Units_" + unitIDString + "_baseID"
set dls_i = StringHashBJ(str)
set baseID = LoadIntegerBJ(0, dls_i, udg_UnitAI)
set baseIDString = I2S(baseID)
set str = "Player_" + playerIDString + "_base_" + baseIDString
//UPDATE BASE TRAINING COUNT
set count = LoadIntegerBJ(0, StringHashBJ(str + "_has_building_" + orderString + "_count"), udg_PlayerAI[p])
set count = count - 1
call sAI_saveIntegerParameter(count, "count", str + "_has_building_" + orderString, udg_PlayerAI[p])
//UPDATE SPECIFIC UNIT TRAINING COUNT
set str = "Units_" + trainerIDString
call sAI_saveBooleanParameter(true, "training", str, udg_PlayerAI[p])
call sAI_saveBooleanParameter(true, orderString, str + "_training", udg_PlayerAI[p])
set count = LoadIntegerBJ(0, StringHashBJ(str + "_training_" + orderString + "_count"), udg_PlayerAI[p])
set count = count - 1
call sAI_saveIntegerParameter(count, "count", str + "_training_" + orderString , udg_PlayerAI[p])
//PLUG LEAKS
set unitIDString = ""
set trainer = null
set orderString = ""
set trainerTypeS = ""
set trainerIDString = ""
set str = ""
set dls_i = 0
set tIS = ""
set trainIndex = 0
set tIC = 0
set p = 0
set playerIDString = ""
set baseID = 0
set baseIDString = ""
set count = 0
endfunction
//===========================================================================
function InitTrig_PlayerAI_x_Building_Cancels_Training_2 takes nothing returns nothing
set gg_trg_PlayerAI_x_Building_Cancels_Training_2 = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_PlayerAI_x_Building_Cancels_Training_2, EVENT_PLAYER_UNIT_TRAIN_CANCEL )
call TriggerAddAction( gg_trg_PlayerAI_x_Building_Cancels_Training_2, function Trig_PlayerAI_x_Building_Cancels_Training_2_Actions )
endfunction
function Trig_Unit_Changes_Owner_Actions takes nothing returns nothing
local integer pPlayer = GetConvertedPlayerId(GetChangingUnitPrevOwner())
local integer p = GetConvertedPlayerId(GetTriggerPlayer())
local integer b = 0
local unit u = GetChangingUnit()
local string str = ""
//MAIN PART
set str = "Units_" + I2S(GetHandleIdBJ(u)) + "_baseID"
set b = LoadIntegerBJ(0, StringHashBJ(str), udg_UnitAI)
call sAI_baseRemoveUnit(pPlayer, b, u)
call sAI_assignNearbyBaseToUnit(p, u) // just use this (if something else is needed, I assume the appropriate function will cover it)
//PLUG LEAKS
set pPlayer = 0
set p = 0
set b = 0
set u = null
set str = ""
endfunction
//===========================================================================
function InitTrig_Unit_Changes_Owner takes nothing returns nothing
set gg_trg_Unit_Changes_Owner = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Unit_Changes_Owner, EVENT_PLAYER_UNIT_CHANGE_OWNER )
call TriggerAddAction( gg_trg_Unit_Changes_Owner, function Trig_Unit_Changes_Owner_Actions )
endfunction
function sAI_playerAIUpdate takes integer p returns nothing
local integer numBases = 0
local integer i = 1
local integer iC = 0
local string prefix = ""
local string str = ""
local integer dls_i = 0
//MAIN PART
set prefix = "Player_" + I2S(p) + "_base"
set str = prefix + "_indexCount"
set dls_i = StringHashBJ(str)
set numBases = LoadIntegerBJ(0, dls_i, udg_PlayerAI[p])
loop
exitwhen (i > numBases)
call sAI_base_AI(p, i)
set i = i + 1
endloop
//PLUG LEAKS
set numBases = 0
set i = 0
set iC = 0
set prefix = ""
set str = ""
set dls_i = 0
endfunction
function sAI_unitAIUpdate takes nothing returns nothing
local group lv_group = null
local integer i = 0
local integer lv_limitedUnitCount = 0
set lv_group = GetUnitsInRectOfPlayer(GetPlayableMapRect(), Player(lp_playerID))
set lv_limitedUnitCount = CountUnitsInGroup(lv_group)
loop
exitwhen i > lv_limitedUnitCount // cos I'm gonna splice between into game loops like sc2
call sAI_unitPerformAllOrders(lv_evalUnit)
endloop
//PLUG LEAKS
endfunction
function sAI_unitDies_updateBase takes unit u returns nothing
local string unitIDString = I2S(GetHandleIdBJ(u))
local integer b = LoadIntegerBJ(0, StringHashBJ("Units_" + unitIDString + "_baseID"), udg_UnitAI)
local integer p = GetConvertedPlayerId(GetOwningPlayer(u))
//MAIN PART
call sAI_baseRemoveUnit(p,b,u)
//PLUG LEAKS
set unitIDString = ""
set b = 0
set p = 0
//params
set u = null
endfunction
function Trig_Unit_Dies_Actions takes nothing returns nothing
local unit u = GetDyingUnit()
local string uIS = I2S(GetHandleIdBJ(u))
//MAIN PART
if (IsUnitType(u, UNIT_TYPE_HERO) == false) then
call sAI_unitDies_updateBase(u)
//i think technically delete data tree should cover this, if i add effect in there, which should be a good test
call sAI_deleteDataTree(("Units_" + uIS), udg_UnitAI)
endif
call DestroyEffect(LoadEffectHandleBJ(0, StringHashBJ("Units_" + uIS + "_saved_specialEffect"), udg_UnitAI))
//PLUG LEAKS
set u = null
set uIS = ""
endfunction
//===========================================================================
function InitTrig_Unit_Dies takes nothing returns nothing
set gg_trg_Unit_Dies = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Unit_Dies, EVENT_PLAYER_UNIT_DEATH )
call TriggerAddAction( gg_trg_Unit_Dies, function Trig_Unit_Dies_Actions )
endfunction
function sAI_initAI takes nothing returns nothing
local group lv_group = GetUnitsInRectAll(GetPlayableMapRect())
local integer lv_numOfUnits = CountUnitsInGroup(lv_group)
local integer i = 1
local unit lv_evalUnit = null
//======================================
//========================================
//Prefab Player Term Knowledge
//========================================
//call write_sAI_TermsForAll()
//call sAI_addGoldMinesToPlayerKnowledge()
loop
exitwhen i > 28
//call sAI_addPlayerKnowledgeSet1(i)
call sAI_playerAI_pregenReqs(i)
set i = i + 1
endloop
set i = 1
//========================================
// Assign AI to Units
//========================================
loop
exitwhen i > lv_numOfUnits
set lv_evalUnit = FirstOfGroup(lv_group)
call sAI_saveUnitToHash(lv_evalUnit)
call GroupRemoveUnit(lv_group, lv_evalUnit)
set i = i + 1
endloop
//========================================
// Player AI Inits
//========================================
call sAI_herodinPlayerAI_init()
call sAI_undeadGreyPlayerAI_init()
call sAI_undeadBluePlayerAI_init()
call sAI_undeadVioletPlayerAI_init()
call sAI_ericPlayerAI_init()
//PLUG LEAKS
call DestroyGroup(lv_group)
set lv_group = null
set lv_numOfUnits = 0
set i = 0
set lv_evalUnit = null
endfunction
function s_uDS takes unit u, string s returns string
local string uIDS = I2S(GetHandleId(u))
//MAIN PART
set udg_tempString = LoadStringBJ(0, StringHashBJ("Units_" + uIDS + "_" + s), udg_UnitAI)
//PLUG LEAKS
set uIDS = ""
set s = ""
set u = null
//RETURN
return udg_tempString
endfunction
function s_uDI takes unit u, string s returns integer
local string uIDS = I2S(GetHandleId(u))
//MAIN PART
set udg_tempInt = LoadIntegerBJ(0, StringHashBJ("Units_" + uIDS + "_" + s), udg_UnitAI)
//PLUG LEAKS
set uIDS = ""
set s = ""
set u = null
//RETURN
return udg_tempInt
endfunction
function s_uDR takes unit u, string s returns real
local string uIDS = I2S(GetHandleId(u))
//MAIN PART
set udg_tempReal = LoadRealBJ(0, StringHashBJ("Units_" + uIDS + "_" + s), udg_UnitAI)
//PLUG LEAKS
set uIDS = ""
set s = ""
set u = null
//RETURN
return udg_tempReal
endfunction
function s_uDU takes unit u, string s returns unit
local string uIDS = I2S(GetHandleId(u))
//MAIN PART
set udg_tempUnit = LoadUnitHandleBJ(0, StringHashBJ("Units_" + uIDS + "_" + s), udg_UnitAI)
//PLUG LEAKS
set uIDS = ""
set s = ""
set u = null
//RETURN
return udg_tempUnit
endfunction
function s_projectileAbility takes string s returns nothing
//PLUG LEAKS
set s = ""
endfunction
function s_SpiderQueenCheckDest takes nothing returns nothing
local unit u = udg_SpiderQueen
local location uL = GetUnitLoc(u)
local real dist = DistanceBetweenPoints(udg_SpiderQueen_Dest, uL)
//MAIN PART
if ((dist <= 2.0) or (TimerGetRemaining(udg_SpiderQueen_Impatience) == 0)) then
call RemoveLocation(udg_SpiderQueen_Dest)
set udg_SpiderQueen_Dest = null
else
call IssuePointOrderLoc(udg_SpiderQueen, "move", udg_SpiderQueen_Dest)
endif
//PLUG LEAKS
call RemoveLocation(uL)
set uL = null
set dist = 0
set u = null
endfunction
function s_sQ_rockFallEffect takes nothing returns nothing
local timer t = GetExpiredTimer()
local string s = I2S(GetHandleId(t)) + "_unit"
local unit u = LoadUnitHandleBJ(0, StringHashBJ(s), udg_tempHash)
local location uL = GetUnitLoc(u)
//MAIN PART
call CameraClearNoiseForPlayer( Player(0) )
call KillUnit(u)
//call DisplayTextToForce( GetPlayersAll(), "boop" )
call PlaySoundAtPointBJ( gg_snd_ThunderBoltMissileDeath, 100, uL, 0 )
call FlushChildHashtableBJ( StringHashBJ(s), udg_tempHash )
//PLUG LEAKS
call RemoveLocation(uL)
set uL = null
call DestroyTimer(t)
set s = ""
set t = null
set u = null
endfunction
function s_sQ_rockFall takes nothing returns nothing
local location l = null
local integer i = 1
local integer iC = udg_SpiderQueen_Rocks
local real speed = 200
local real height = 0
local real time = 0
local unit u = null
local timer t = null
local location uL = GetUnitLoc(udg_SpiderQueen)
//mew
local location l1 = GetRectCenter(gg_rct_sQ_move_to)
local location l2 = GetCameraTargetPositionLoc()
local real r = DistanceBetweenPoints(l1, l2)
//MAIN PART
if (r < 1500.00 ) then
call CameraSetEQNoiseForPlayer( Player(0), 2.00 )
endif
call PlaySoundAtPointBJ( gg_snd_ThunderClapCaster, 100, uL, 0 )
loop
exitwhen (i > iC)
set l = GetRandomLocInRect(gg_rct_rocks)
call CreateNUnitsAtLoc( 1, 'n01G', GetOwningPlayer(udg_SpiderQueen), l, GetRandomDirectionDeg() )
set u = GetLastCreatedUnit()
set height = BlzGetLocalUnitZ(u)
call SetUnitFlyHeightBJ( u, -50, speed )
if (speed != 0) then
set t = CreateTimer()
call sAI_saveUnitParameter(u, "unit", I2S(GetHandleId(t)), udg_tempHash)
set time = height / speed
set time = 2
call TimerStart(t, time, false, function s_sQ_rockFallEffect)
endif
call RemoveLocation(l)
set i = i + 1
endloop
call StartTimerBJ(udg_SpiderQueen_RockTimer, false, 20)
// PLUG LEAKS
call RemoveLocation(l)
set l = null
call RemoveLocation(uL)
set uL = null
call RemoveLocation(l1)
set l1 = null
call RemoveLocation(l2)
set l2 = null
set i = 0
set iC = 0
set r = 0
set speed = 0
set height = 0
set time = 0
set u = null
endfunction
function s_sQ_spawnSpiders takes nothing returns nothing
endfunction
function s_sQ_throwHammer takes nothing returns nothing
if (UnitHasItemOfTypeBJ(udg_SpiderQueen, 'I00P') == false) then // replace with throwable hammer
// "i'll get my hammer!"
else
endif
endfunction
function s_sQ_move takes nothing returns nothing
call IssuePointOrderLoc(udg_SpiderQueen, "move", udg_SpiderQueen_Dest)
endfunction
function s_sQ_move takes nothing returns nothing
call IssuePointOrderLoc(udg_SpiderQueen, "move", udg_SpiderQueen_Dest)
endfunction
function s_sQ_move takes nothing returns nothing
call IssuePointOrderLoc(udg_SpiderQueen, "move", udg_SpiderQueen_Dest)
endfunction
function s_sQ_return takes nothing returns nothing
local location l = null
local unit u = udg_SpiderQueen
//MAIN PART
if ( RectContainsUnit(gg_rct_spiderqueenreturn, udg_SpiderQueen) == true ) then
call SetUnitFacingToFaceLocTimed( udg_SpiderQueen, GetRectCenter(gg_rct_spiderqueenface), 0 )
else
call IssuePointOrderLocBJ( udg_SpiderQueen, "move", GetRectCenter(gg_rct_spiderqueenreturn) )
endif
//PLUG LEAKS
call RemoveLocation(l)
set l = null
set u = null
endfunction
function s_sQ_emerge takes nothing returns nothing
local location l = null
local integer i = GetRandomInt(1,4)
local integer i2 = 1
local unit u = udg_SpiderQueen
//MAIN PART
if (i == i2) then
set l = GetRectCenter(gg_rct_sQ1)
endif
set i2 = i2 + 1
if (i == i2) then
set l = GetRectCenter(gg_rct_sQ2)
endif
set i2 = i2 + 1
if (i == i2) then
set l = GetRectCenter(gg_rct_sQ3)
endif
set i2 = i2 + 1
if (i == i2) then
set l = GetRectCenter(gg_rct_sQ4)
endif
set i2 = i2 + 1
call SetUnitPositionLoc( u, l )
call ShowUnitShow( u )
call SetUnitInvulnerable( udg_SpiderQueen, false )
call PauseUnitBJ( false, udg_SpiderQueen )
set udg_SpiderQueen_Hidden = false
//set udg_SpiderQueen_Spell = udg_str_move
call RemoveLocation(udg_SpiderQueen_Dest)
set udg_SpiderQueen_Dest = GetRandomLocInRect(gg_rct_sQ_move_to)
call s_sQ_return()
//PLUG LEAKS
set u = null
call RemoveLocation(l)
set l = null
set i = 0
set i2 = 0
endfunction
function s_sQ_hideEffect takes nothing returns nothing
local unit u = udg_SpiderQueen
//MAIN PART
call ShowUnitHide( u )
call SetUnitFlyHeightBJ( u, 0, 9000 )
call DestroyEffectBJ( udg_SpiderQueen_LaunchFX )
//PLUG LEAKS
call DestroyTimer(GetExpiredTimer())
set u = null
endfunction
function s_sQ_hide takes nothing returns nothing // launches directly up
local unit u = udg_SpiderQueen
local location uL = GetUnitLoc(u)
//MAIN PART
call AddSpecialEffectLocBJ( uL, "Objects\\Spawnmodels\\Other\\ToonBoom\\ToonBoom.mdl" )
set udg_SpiderQueen_LaunchFX = GetLastCreatedEffectBJ()
call SetUnitFlyHeightBJ( u, 600, 600 )
call PlaySoundAtPointBJ( gg_snd_ThunderBoltMissileDeath, 100, uL, 0 )
call SetUnitInvulnerable( udg_SpiderQueen, true )
call PauseUnitBJ( true, udg_SpiderQueen )
set udg_SpiderQueen_Hidden = true
call EnableTrigger( gg_trg_SQ_Emerge_Timer )
call StartTimerBJ(udg_SpiderQueen_EmergeTimer, false, 10)
call TimerStart(CreateTimer(), 1, false, function s_sQ_hideEffect)
//PLUG LEAKS
call RemoveLocation(uL)
set uL = null
set u = null
endfunction
function s_isUnitEnemy takes nothing returns boolean
return ( IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(udg_SpiderQueen)) == true )
endfunction
function s_spiderQueenUseSpell takes nothing returns nothing
local integer i = GetRandomInt(1,2)
local string s = udg_SpiderQueen_Spell
local group g = GetUnitsInRectMatching(gg_rct_Optic_Queen_Battlezone, Condition(function s_isUnitEnemy))
local unit u = GroupPickRandomUnit(g)
local location uL = GetUnitLoc(u)
//MAIN PART
if (s == udg_str_spawnSpiders) then
call s_sQ_spawnSpiders()
endif
if ((s == udg_str_rockFall)) then
call s_sQ_rockFall()
endif
if (s == udg_str_ensnare) then
call IssueTargetOrderBJ( udg_SpiderQueen, "ensnare", u )
endif
if (s == udg_str_retreat) then
if ((udg_SpiderQueen_Hidden == false) and (TimerGetRemaining(udg_SpiderQueen_EmergeTimer) <= 0) and (TimerGetRemaining(udg_SpiderQueen_RockTimer) <= 0)) then
call s_sQ_hide()
endif
endif
if (s == udg_str_attack) then
call IssueTargetOrderBJ( udg_SpiderQueen, "attack", u )
endif
if (s == udg_str_laser) then
call IssueTargetOrderBJ( udg_SpiderQueen, "shadowstrike", u )
endif
if (s == udg_str_throwHammer) then
call IssueTargetOrderBJ( udg_SpiderQueen, "thunderbolt", u )
endif
if (s == udg_str_move) then
call s_sQ_move()
endif
//PLUG LEAKS
call DestroyGroup(g)
set g = null
call RemoveLocation(uL)
set uL = null
set u = null
set s = ""
set i = 0
endfunction
function s_spiderQueenSelectSpell takes nothing returns nothing
local integer i = GetRandomInt(1,6)
local integer i2 = 1
//MAIN PART
//MAIN
if (udg_SpiderQueen_Spell == udg_str_retreat) then
//=============================
else
if (i == i2) then
set udg_SpiderQueen_Spell = udg_str_spawnSpiders
endif
set i2 = i2 + 1
if (i == i2) then
set udg_SpiderQueen_Spell = udg_str_ensnare
endif
set i2 = i2 + 1
if (i == i2) then
set udg_SpiderQueen_Spell = udg_str_retreat
endif
set i2 = i2 + 1
if (i == i2) then
set udg_SpiderQueen_Spell = udg_str_throwHammer
endif
set i2 = i2 + 1
if (i == i2) then
set udg_SpiderQueen_Spell = udg_str_laser
endif
set i2 = i2 + 1
if (i == i2) then
set udg_SpiderQueen_Spell = udg_str_attack
endif
set i2 = i2 + 1
endif
//CATCHES
if (udg_SpiderQueen_Hidden == true) and (TimerGetRemaining(udg_SpiderQueen_EmergeTimer) > 0 ) then
set udg_SpiderQueen_Spell = udg_str_rockFall
elseif (udg_SpiderQueen_Hidden == true) and (TimerGetRemaining(udg_SpiderQueen_EmergeTimer) <= 0 ) then
set udg_SpiderQueen_Spell = udg_str_retreat
endif
if ((udg_SpiderQueen_Hidden == false) and (udg_SpiderQueen_Enemies == false)) then
set udg_SpiderQueen_Spell = ""
call s_sQ_return()
endif
//PLUG LEAKS
set i = 0
set i2 = 0
endfunction
function s_spiderQueenAI takes nothing returns nothing
local unit u = udg_SpiderQueen
//MAIN PART
call s_spiderQueenSelectSpell()
call s_spiderQueenUseSpell()
//PLUG LEAKS
set u = null
endfunction