//##START##
//===========================================================================
//============================================================
// ===========================
function H2I takes handle h returns integer
return h
return 0
endfunction
// ===========================
function LocalVars takes nothing returns gamecache
if udg_cach == null then
call FlushGameCache(InitGameCache("cach"))
set udg_cach=InitGameCache("cach")
endif
return udg_cach
endfunction
function SetHandleHandle takes handle subject, string name, handle value returns nothing
if value==null then
call FlushStoredInteger(LocalVars(),I2S(H2I(subject)),name)
else
call StoreInteger(LocalVars(), I2S(H2I(subject)), name, H2I(value))
endif
endfunction
function SetHandleInt takes handle subject, string name, integer value returns nothing
if value==0 then
call FlushStoredInteger(LocalVars(),I2S(H2I(subject)),name)
else
call StoreInteger(LocalVars(), I2S(H2I(subject)), name, value)
endif
endfunction
function SetHandleReal takes handle subject, string name, real value returns nothing
if value==0 then
call FlushStoredReal(LocalVars(), I2S(H2I(subject)), name)
else
call StoreReal(LocalVars(), I2S(H2I(subject)), name, value)
endif
endfunction
function SetHandleString takes handle subject, string name, string value returns nothing
if value==null then
call FlushStoredString(LocalVars(), I2S(H2I(subject)), name)
else
call StoreString(LocalVars(), I2S(H2I(subject)), name, value)
endif
endfunction
function GetHandleHandle takes handle subject, string name returns handle
return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
return null
endfunction
function GetHandleInt takes handle subject, string name returns integer
return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
endfunction
function GetHandleReal takes handle subject, string name returns real
return GetStoredReal(LocalVars(), I2S(H2I(subject)), name)
endfunction
function GetHandleString takes handle subject, string name returns string
return GetStoredString(LocalVars(), I2S(H2I(subject)), name)
endfunction
function GetHandleUnit takes handle subject, string name returns unit
return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
return null
endfunction
function GetHandleTimer takes handle subject, string name returns timer
return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
return null
endfunction
function GetHandleTrigger takes handle subject, string name returns trigger
return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
return null
endfunction
function GetHandleEffect takes handle subject, string name returns effect
return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
return null
endfunction
function GetHandleGroup takes handle subject, string name returns group
return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
return null
endfunction
function FlushHandleLocals takes handle subject returns nothing
call FlushStoredMission(LocalVars(), I2S(H2I(subject)) )
endfunction
//*******************************************
//AUXILIARY FUNCTIONS
function PolarProjectionX takes real x, real distance, real angle returns real
return x+distance*Cos(angle * bj_DEGTORAD)
endfunction
function PolarProjectionY takes real y, real distance, real angle returns real
return y+distance*Sin(angle * bj_DEGTORAD)
endfunction
function GetAngleBetweenPoints takes real x1, real y1, real x2, real y2 returns real
return bj_RADTODEG * Atan2(y2 - y1, x2 - x1)
endfunction
function GetDistanceBetweenPoints takes real x1, real y1,real x2, real y2 returns real
return SquareRoot((x2-x1)*(x2-x1) + (y2-y1) * (y2-y1))
endfunction
function GetGroupUnitMinLife takes group g returns unit
local group k = CreateGroup()
local unit u
local unit min
local real quota
if FirstOfGroup(g)!=null then
call GroupAddGroup(g,k)
set min = FirstOfGroup(k)
set quota = GetUnitState(min, UNIT_STATE_LIFE)
call GroupRemoveUnit(k,min)
loop
set u = FirstOfGroup(k)
exitwhen u==null
call GroupRemoveUnit(k,u)
if GetUnitState(u, UNIT_STATE_LIFE)<quota then
set quota = GetUnitState(u, UNIT_STATE_LIFE)
set min = u
endif
set u = FirstOfGroup(k)
endloop
return min
endif
return null
endfunction
//********************************************************************************************
//*
//* Pool Class Functions
//* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
//* To implement them, first make sure that you have a gamecache variable udg_poolclass , to
//* Copy it either use next trigger called "Variable Copyness" or just go the trigger editor,
//* press ctrol + b and create a gamecache variable called poolclass, the udg_ is added
//* automatically.
//*
//* After that, copy the contents of this trigger begining with the //##Start## and
//* ending with the //##End## TO YOUR MAP'S CUSTOM SCRIPT SECTION , DON'T JUST Copy the trigger
//* ( The custom script section is at the top of the trigger list with the map's name.
//*
//* In theory, you may just copy the trigger, making sure it is above any other trigger, then
//* Instantly save, this is easier, but may not work well.
//*
//********************************************************************************************
//===================================================================================
function PoolClass takes nothing returns gamecache
if udg_poolclass==null then
call FlushGameCache(InitGameCache("pool.vx"))
set udg_poolclass=InitGameCache("pool.vx")
call ExecuteFunc("Pool_SetupCharMap")
endif
return udg_poolclass
endfunction
//===================================================================================
function PoolGetItem takes integer poolid, integer itemn returns integer
return GetStoredInteger( PoolClass(), I2S(poolid), I2S(itemn))
endfunction
//===================================================================================
function CountItemsInPool takes integer poolid returns integer
return GetStoredInteger( PoolClass(), I2S(poolid), "n")
endfunction
//===================================================================================
function GetEnumPoolItem takes nothing returns integer
return GetStoredInteger( PoolClass(), "Class", "Enum")
endfunction
//===================================================================================
function ForPool takes integer poolid, code callback returns nothing
local trigger t=CreateTrigger()
local integer a=1
local integer n=CountItemsInPool( poolid)
local gamecache pc=PoolClass()
call TriggerAddAction( t, callback)
call TriggerWaitOnSleeps( t, true)
loop
exitwhen a>n
call StoreInteger( pc, "Class", "Enum", PoolGetItem( poolid, a))
call TriggerExecute(t)
set a=a+1
endloop
call FlushStoredInteger( pc, "Class", "Enum")
call DestroyTrigger( t)
set t=null
set pc=null
endfunction
//===================================================================================
// Uses a the function's name instead of a code argumment, it is better than ForPool
// because ForPool Creates Triggers to run the callback
//
function ForPool2 takes integer poolid, string callbackfuncname returns nothing
local integer a=1
local integer n=CountItemsInPool( poolid)
local gamecache pc=PoolClass()
loop
exitwhen a>n
call StoreInteger( pc, "Class", "Enum", PoolGetItem( poolid, a))
call ExecuteFunc(callbackfuncname)
set a=a+1
endloop
set pc=null
endfunction
//===================================================================================
function GetFirstOfPool takes integer poolid returns integer
return GetStoredInteger( PoolClass(), I2S(poolid), "1")
endfunction
//===================================================================================
function PoolPickRandomItem takes integer poolid returns integer
return GetStoredInteger( PoolClass(), I2S(poolid), I2S( GetRandomInt( 1, GetStoredInteger( PoolClass(), I2S(poolid), "n" ) ) ))
endfunction
//===================================================================================
function GetItemPositionInPool takes integer poolid, integer it returns integer
return GetStoredInteger( PoolClass(), I2S(poolid), "i"+I2S(it))
endfunction
//===================================================================================
function IsItemInPool takes integer poolid, integer it returns boolean
return GetItemPositionInPool( poolid, it) != 0
endfunction
//===================================================================================
function PoolAddItem takes integer poolid, integer value returns nothing
local integer n
local gamecache pc=PoolClass()
if not IsItemInPool( poolid, value) then
set n=GetStoredInteger( pc, I2S(poolid), "n") + 1
call StoreInteger( pc, I2S(poolid), "n", n)
call StoreInteger( pc, I2S(poolid), I2S(n), value)
call StoreInteger( pc, I2S(poolid) , "i"+I2S(value), n )
endif
set pc=null
endfunction
//===================================================================================
function PoolRemoveItem takes integer poolid, integer value returns nothing
local integer p=GetItemPositionInPool( poolid, value)
local integer n=GetStoredInteger( PoolClass(), I2S(poolid), "n")
local gamecache pc=PoolClass()
if p!=0 then
call FlushStoredInteger( pc, I2S(poolid), I2S(p))
call FlushStoredInteger( pc, I2S(poolid), "i"+I2S(value))
if n > p then
call StoreInteger( pc, I2S(poolid), I2S(p), GetStoredInteger( pc, I2S(poolid), I2S(n)))
call StoreInteger( pc, I2S(poolid), "i"+I2S( GetStoredInteger( pc, I2S(poolid), I2S(n))), p)
call FlushStoredInteger( pc, I2S(poolid), I2S(n))
endif
call StoreInteger( pc, I2S(poolid), "n", n - 1)
endif
set pc=null
endfunction
//===================================================================================
function PoolAddPool takes integer sourcepoolid, integer destpoolid returns nothing
local integer a=1
local integer n=CountItemsInPool( sourcepoolid)
loop
exitwhen a>n
call PoolAddItem( destpoolid, PoolGetItem( sourcepoolid, a))
set a=a+1
endloop
endfunction
//===================================================================================
function PoolRemovePool takes integer sourcepoolid, integer destpoolid returns nothing
local integer a=1
local integer n=CountItemsInPool( sourcepoolid)
loop
exitwhen a>n
call PoolRemoveItem( destpoolid, PoolGetItem( sourcepoolid, a))
set a=a+1
endloop
endfunction
//===================================================================================
function DestroyPool takes integer poolid returns nothing
call FlushStoredMission( PoolClass(), I2S(poolid))
endfunction
//===================================================================================
function CreatePool takes nothing returns integer
local integer N=GetStoredInteger( PoolClass(), "Class", "N") + 1
call StoreInteger( PoolClass(), "Class", "N", N)
return N
endfunction
//===================================================================================
// Adds a tokenized string to a pool,
// Example: PoolAddS(udg_p, "1;2;3;4") will add to the udg_p pool : 1,2,3 and 4
//
function PoolAddS takes integer poolid, string s returns nothing
local string current=""
local integer i=0
set s=s+";"
loop
exitwhen SubString(s, i, i+1) == "" or SubString(s, i, i+1) == null
if SubString(s, i, i+1) == ";" then
call PoolAddItem( poolid, S2I(current))
set current=""
else
set current=current+SubString(s, i, i+1)
endif
set i=i+1
endloop
endfunction
//===================================================================================
// Converts a tokenized string into a pool,
// Example: S2Pool( "1;2;3;4") will return a pool that has 1,2,3 and 4 inside
//
function S2Pool takes string s returns integer
local integer spool= CreatePool()
call PoolAddS(spool,s)
return spool
endfunction
//=============================================================================================================
constant function Pool_SafePercent takes nothing returns string
if ("%"=="") then
return "%%"
endif
return "%" //would like to thank blizzard for the dumb bug.
endfunction
//=============================================================================================================
function Pool_SetupCharMap takes nothing returns nothing
local gamecache g=udg_poolclass
local string cm=".................................!.#$"+Pool_SafePercent()+"&'()*+,-./0123456789:;<=>.@ABCDEFGHIJKLMNOPQRSTUVWXYZ[.]^_`abcdefghijklmnopqrstuvwxyz{|}~................................................................................................................................."
local integer i=0
local string c
if HaveStoredInteger(g,"charmap","A2") then
return
endif
loop
set c=SubString(cm,i,i+1)
exitwhen (c==null) or (c=="")
if (c!=".") then
if c==StringCase(c,true) then
set c=c+"2"
else
set c=c+"1"
endif
call StoreInteger(g,"charmap",c,i)
endif
set i=i+1
endloop
set g=null
endfunction
function Pool_Rawcode2Int takes gamecache g, string s returns integer
local string c
local integer i=0
local integer r=0
loop
exitwhen i>3
set c=SubString(s,i,i+1)
set r=r*256
if c==StringCase(c,true) then
set c=c+"2"
else
set c=c+"1"
endif
set r=r+GetStoredInteger(g,"charmap",c)
set i=i+1
endloop
return r
endfunction
function PoolAddRawcodes_thread takes nothing returns nothing
//Threaded because I don't want it to halt execution for no reason
//
local gamecache g=PoolClass()
local string s=bj_lastPlayedMusic
local integer poolid=bj_groupEnumTypeId
local string current=""
local integer i=0
set s=s+";"
loop
exitwhen SubString(s, i, i+1) == "" or SubString(s, i, i+1) == null
if SubString(s, i, i+1) == ";" then
call PoolAddItem(poolid, Pool_Rawcode2Int(g,current))
set current=""
else
set current=current+SubString(s, i, i+1)
endif
set i=i+1
endloop
set g=null
endfunction
//=====================================================================================================================
// Adds a string of tokenized rawcodes to a pool
// Example: PoolAddRawcodes(udg_p,"A000;A001") will add 'A000' and 'A001' to the pool
//
// (Saves some lines, but is not as good efficiency wise)
//
function PoolAddRawcodes takes integer poolid, string s returns nothing
local string b=bj_lastPlayedMusic
set bj_groupEnumTypeId=poolid
set bj_lastPlayedMusic=s
call ExecuteFunc("PoolAddRawcodes_thread")
set bj_lastPlayedMusic=b
endfunction
//===================================================================================================================
// Converts a tokenized string of rawcodes into a pool,
// Example: Rawcodes2Pool( "A000;A001;AHbz;S000") will return a pool that has 'A000,'A001','AHbx' and 'S000' inside
//
// (Saves some lines, but is not as good efficiency wise)
//
function Rawcodes2Pool takes string s returns integer
local integer spool= CreatePool()
call PoolAddRawcodes(spool,s)
return spool
endfunction
//=================================================================================================
//
// For more JASS scripts, visit : http://www.wc3jass.com
//
//=================================================================================================
//=================================================================================================
function Ascii_cache takes nothing returns gamecache
if (udg_ascii==null) then
call FlushGameCache(InitGameCache("arcii.vx"))
set udg_ascii=InitGameCache("arcii.vx")
endif
return udg_ascii
endfunction
constant function Ascii_SafePercent takes nothing returns string
if ("%"=="") then
return "%%"
endif
return "%" //would like to thank blizzard for the dumb bug.
endfunction
//=================================================================================================
// Ascii table, kinda
//
function AsciiCharToInteger_sub takes string u returns integer
local string charMap = " !\"#$"+Ascii_SafePercent()+"&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
local string c
local integer i = 0
if (u == "\b") then // Backspace?
return 8
elseif u == "\t" then // Horizontal Tab?
return 9
elseif u == "\n" then // Newline
return 10
elseif u == "\f" then // Form feed?
return 12
elseif u == "\r" then // Carriage return
return 13
endif
loop
set c = SubString(charMap, i, i + 1)
exitwhen c == ""
if c == u then
return i + 32
endif
set i = i + 1
endloop
return 0
endfunction
function AsciiCharToInteger takes string char returns integer
local string k
local string u = SubString(char, 0, 1)
local integer r
if (u == "") or (u == null) then
return 0
endif
if (StringCase(u,true)==u) then
set k=u
else //Gamecache is not case sensitive, we have to deal with that
set k=u+"1"
endif
if HaveStoredInteger(Ascii_cache(),"ascii",k) then
return GetStoredInteger(Ascii_cache(),"ascii",k)
endif
set r=AsciiCharToInteger_sub(u)
call StoreInteger(Ascii_cache(),"ascii",k,r)
return r
endfunction
//=================================================================================================
// Each string belongs to a group out of range groups, the bigger the range value is, the lesser
// the chance 2 strings will have the same Identity will be
//
function GetStringIdentity takes string s, integer range returns integer
local integer len = StringLength(s)
local integer i = 0
local integer Result = 0
loop
exitwhen (i>=len)
set Result = Result+AsciiCharToInteger(SubString(s,i,i+1))
if (Result>=range) then
set Result=Result-range
endif
set i = i + 1
endloop
return Result
endfunction
//##End##
function InitTrig_Codemaker takes nothing returns nothing
endfunction
//##start##
//*************************************************************************************************
//*
//* The code maker engine
//*
//*************************************************************************************************
//#################################################################################################
//
// Constants:
//
//=================================================================================================
constant function Codemaker_Charmap takes nothing returns string
return "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789@+!*"
//
// (Affects default charmap)
//
// Length of charmap must be a power of 2 (64 in this case)
// The bigger the charmap is, the sorter the code will be.
//
// The order, and the characters you use, will change the resulting code,
// you can have an unique charmap.
//
endfunction
constant function Codemaker_FCSsize takes nothing returns integer
return 7
//
// (Affects default charmap)
//
endfunction
//################################################################################################
//
// Private Functions:
//
//=================================================================================================
function Codemaker takes nothing returns gamecache
if (udg_codemaker==null) then
call FlushGameCache(InitGameCache("codemaker"))
set udg_codemaker=InitGameCache("codemaker")
endif
return udg_codemaker
endfunction
//=================================================================================================
// I think a limit of 4095 is way enough for saveable values
//
function Codemaker_val takes integer i returns integer
return udg_codemaker_vals[i]
endfunction
function Codemaker_size takes integer i returns integer
return udg_codemaker_size[i]
endfunction
function Codemaker_vals takes nothing returns integer
return udg_codemaker_vals[0]
endfunction
//=================================================================================================
//
//
function Codemaker_UseCharmap takes integer id returns boolean
local string k=I2S(id)
if GetStoredBoolean(Codemaker(),"charmaps",k) then
call StoreInteger(Codemaker(),"charmaps","current",id)
return true
endif
return false
endfunction
function Codemaker_CurrentCharmap takes nothing returns string
return I2S( GetStoredInteger(Codemaker(),"charmaps","current") )
endfunction
function BinStr_NOT takes string bin, integer bits returns string
local integer i=0
local string r=""
loop
exitwhen (i>=bits)
if (SubString(bin,i,i+1)=="1") then
set r=r+"0"
else
set r=r+"1"
endif
set i=i+1
endloop
return r
endfunction
function BinStr_ADD takes string bina, string binb, integer n returns string
local string r=""
local string c1
local string c2
local string c3
local boolean cr=false
loop
exitwhen (n<=0)
set c1=SubString(bina,n-1,n)
set c2=SubString(binb,n-1,n)
if (c2!=c1) then
if cr then
set c3="0"
else
set c3="1"
endif
elseif (c1==c2) and (c1=="1") then
if cr then
set c3="1"
else
set c3="0"
set cr=true
endif
else
if cr then
set c3="1"
set cr=false
else
set c3="0"
endif
endif
set r=c3+r
set n=n-1
endloop
return r
endfunction
//=========================================================================================================================================
function BinStr_XOR takes string bin1, string bin2, integer bits returns string
local string r=""
local integer i=1
local integer c1=1
local integer c2=1
local integer L1=StringLength(bin1)
local integer L2=StringLength(bin2)
loop
exitwhen (i>bits)
if ( (SubString(bin1,c1-1,c1)=="1") != (SubString(bin2,c2-1,c2)=="1") ) then
set r=r+"1"
else
set r=r+"0"
endif
set i=i+1
set c1=c1+1
set c2=c2+1
if (c1>L1) then
set c1=1
endif
if (c2>L2) then
set c2=1
endif
endloop
return r
endfunction
//=========================================================================================================================================
function Codemaker_Int2BinStr takes integer i, integer bits returns string
//Example 0,4="0000"
//Example 1,4="1000"
//Example 5,5="10100"
local integer div
local string r=""
local string max=""
if (bits<32) then
if (i<0) then
return Codemaker_Int2BinStr(0,bits)
endif
elseif (i<0) then
set r=Codemaker_Int2BinStr(-i,31)
set r=BinStr_NOT(r,31)
set r=BinStr_ADD(r,Codemaker_Int2BinStr(1,31),31)
return "1"+r+max
endif
loop
exitwhen (bits==0)
set div=i/2
if (div*2==i) then
set r="0"+r
else
set r="1"+r
endif
set max="1"+max
set i=div
set bits=bits-1
endloop
if (i!=0) then
return max
endif
return r
endfunction
function Codemaker_BinStr2Int takes string bin, integer bits returns integer
// "0000",4= 0
// "0010",4= 2
// "04H1",4= 1
// "" ,4= 0
// "11" ,4=12
local integer div
local string ch
local integer r=0
local integer p=1
loop
exitwhen (bits<=0)
set ch=SubString(bin,bits-1,bits)
if (ch=="1") then
set r=r+p
endif
set p=p*2
set bits=bits-1
endloop
return r
endfunction
function Codemaker_EncodeBinStr takes string bin returns string
local gamecache g=Codemaker()
local string k=Codemaker_CurrentCharmap()
local integer sz=GetStoredInteger(g,k+"bitsperchar","now")
local integer l
local integer i=0
local string ch
local string r=""
set k=k+"bin2char"
// loop
// exitwhen (ModuloInteger(StringLength(bin) , sz)==0)
// set bin=bin+"0"
//endloop
loop
set ch=SubString(bin,i,i+sz)
exitwhen (ch=="") or (ch==null)
if HaveStoredString(g,k,ch) then
set r=r+GetStoredString(g,k,ch)
else
set r=r+GetStoredString(g,k,"def")
endif
set i=i+sz
endloop
set g=null
return r
endfunction
function Codemaker_DecodeBinStr takes string cod returns string
local gamecache g=Codemaker()
local integer i=0
local string k=Codemaker_CurrentCharmap()+"char2bin"
local string r=""
local string ch
loop
set ch=SubString(cod,i,i+1)
exitwhen (ch=="") or (ch==null)
if (StringCase(ch,true)==ch) then
set ch=ch+"1"
endif
if HaveStoredString(g,k,ch) then
set r=r+GetStoredString(g,k,ch)
else
set g=null
return ""
endif
set i=i+1
endloop
set g=null
return r
endfunction
//=========================================================================================================================================
function Codemaker_FromArrayToBin takes nothing returns string
local integer n=Codemaker_vals()
local integer i=1
local string r=""
loop
exitwhen (i>n)
set r=r+Codemaker_Int2BinStr(Codemaker_val(i),Codemaker_size(i))
set i=i+1
endloop
return r
endfunction
function Codemaker_GetCRC takes string bin, integer n returns string
local integer mod=R2I(Pow(2,n))
local integer s=0
local string c
local integer i=0
loop
set c=SubString(bin,i,i+n)
exitwhen (c=="") or (c==null)
set s= ModuloInteger(s+Codemaker_BinStr2Int(c,n),mod)
set i=i+n
endloop
return Codemaker_Int2BinStr(s,n)
endfunction
function Codemaker_AddCRC takes string bin returns string
local integer n=GetStoredInteger( Codemaker() , Codemaker_CurrentCharmap() , "FCS")
local string crc=Codemaker_GetCRC(bin,n)
return( crc+ BinStr_XOR(bin,crc,StringLength(bin)) )
endfunction
function Codemaker_FixBitNumber takes string bin returns string
local integer sz=GetStoredInteger(Codemaker(),Codemaker_CurrentCharmap()+"bitsperchar","now")
loop
exitwhen (ModuloInteger(StringLength(bin) , sz)==0)
set bin=bin+"0"
endloop
return bin
endfunction
function Codemaker_EncodeForPlayer takes string bin, player p returns string
local string in=Codemaker_FixBitNumber(bin)
local integer i=0
local integer l=StringLength(in)
local integer tt= IMinBJ(l, 31)
local string id= Codemaker_Int2BinStr( GetStringIdentity(GetPlayerName(p),R2I( Pow(2,tt) )) , tt)
local string r=""
loop
exitwhen i>=l
if (i+tt>=l) then
set tt=l-i
endif
set r=r+BinStr_XOR(SubString(in,i,i+tt),id,tt)
set i=i+tt
endloop
return r
endfunction
//=============================================================================================================
function Codemaker_DecodeForPlayer takes string bin, player p returns string
local integer i=0
local integer l=StringLength(bin)
local integer tt= IMinBJ(l, 31)
local string id= Codemaker_Int2BinStr( GetStringIdentity(GetPlayerName(p),R2I( Pow(2,tt) )) , tt)
local string r=""
loop
exitwhen i>=l
if (i+tt>=l) then
set tt=l-i
endif
set r=r+BinStr_XOR(SubString(bin,i,i+tt),id,tt)
set i=i+tt
endloop
return r
endfunction
function Codemaker_TotalBits takes nothing returns integer
local integer i=udg_codemaker_vals[0]
local integer r=0
loop
exitwhen (i<=0)
set r=r+udg_codemaker_size[i]
set i=i-1
endloop
return r
endfunction
function Codemaker_TotalCodeLength takes nothing returns integer
local string k=Codemaker_CurrentCharmap()
local integer r=Codemaker_TotalBits()+GetStoredInteger( Codemaker() , k , "FCS")
local integer l=GetStoredInteger (Codemaker(),k+"bitsperchar","now")
loop
exitwhen (ModuloInteger(r,l)==0)
set r=r+1
endloop
return (r/l)
endfunction
function Codemaker_CheckCRC takes string bin returns string
local integer n=GetStoredInteger( Codemaker() , Codemaker_CurrentCharmap() , "FCS")
local integer T=Codemaker_TotalBits()
local string rbin= SubString(bin,n,n+T)
local string crc= SubString(bin,0,n)
set rbin=BinStr_XOR(rbin,crc,T)
if (Codemaker_GetCRC(rbin,n)!=crc) then
return ""
endif
return rbin
endfunction
function Codemaker_FromBinToArray takes string bin returns integer
local integer n=Codemaker_vals()
local integer i=1
local integer j=0
local integer sz
local string ch
loop
exitwhen (i>n)
set sz=Codemaker_size(i)
set ch=SubString(bin,j,j+sz)
if (StringLength(ch)< sz ) then
return 4 //Missing bits
endif
set udg_codemaker_vals[i] = Codemaker_BinStr2Int(ch,sz)
set i=i+1
set j=j+sz
endloop
return 0
endfunction
function Codemaker_GetId takes trigger t returns integer
return t
return 0
endfunction
function Codemaker_AskString_Child takes nothing returns nothing
local gamecache g=Codemaker()
local string k= I2S( Codemaker_GetId( GetTriggeringTrigger() ) )
local string cmd=GetStoredString(g,k,"cmd")
local integer l=StringLength(cmd)
local boolean b=false
local string chat=GetEventPlayerChatString()
local string r
if (chat==GetStoredString(g,k,"cnl")) then
call DisplayTimedTextToPlayer(GetTriggerPlayer(),0,0,2,chat)
set b=true
set r=""
elseif (SubString(chat,0,l)==cmd) then
set r=SubString(chat,l,StringLength(chat))
set b=((r!=null) and (r!=""))
endif
if not(b) then
call DisplayTimedTextToPlayer(GetTriggerPlayer(),0,0,GetStoredReal(g,k,"rem"),GetStoredString(g,k,"prm"))
else
call StoreString(g,k,"result",r)
endif
set g=null
endfunction
function Codemaker_GenerateCode_Thread takes nothing returns nothing
local string r
set r=Codemaker_FromArrayToBin()
set r=Codemaker_AddCRC(r)
if (bj_groupEnumOwningPlayer!=null) then
set r=Codemaker_EncodeForPlayer(r,bj_groupEnumOwningPlayer)
endif
set bj_lastPlayedMusic=Codemaker_EncodeBinStr(r)
endfunction
function Codemaker_ReadCode_thread takes nothing returns nothing
local player p=bj_groupEnumOwningPlayer
local string cod=bj_lastPlayedMusic
local integer T=Codemaker_TotalCodeLength()
local integer L=StringLength(cod)
set bj_groupEnumTypeId=5
if (L<T) then
set bj_groupEnumTypeId=1
else
if (L>T) then
set cod=SubString(cod,0,T)
endif
set cod=Codemaker_DecodeBinStr(cod)
if (cod=="") then
set bj_groupEnumTypeId=2
else
if (p!=null) then
set cod=Codemaker_DecodeForPlayer(cod,p)
endif
set cod=Codemaker_CheckCRC(cod)
if (cod=="") then
set bj_groupEnumTypeId=3
else
set bj_groupEnumTypeId=Codemaker_FromBinToArray(cod)
endif
endif
endif
set p=null
endfunction
//################################################################################################
//
// Public Functions:
//
//================================================================================================
// Generates a code for player p based on udg_codemaker_vals and udg_codemaker_size arrays
//
function Codemaker_GenerateCode takes player p returns string
local string s=bj_lastPlayedMusic
local string r
set bj_groupEnumOwningPlayer=p
call ExecuteFunc("Codemaker_GenerateCode_Thread")
// I don't want the trigger to halt execution because of too long process
set r=bj_lastPlayedMusic
set bj_lastPlayedMusic=s
return r
endfunction
//================================================================================================
// Reads a code for player p based on udg_codemaker_size array and saves result in
// udg_codemaker_vals array, returns non 0 when there is an error.
//
// Error 1 : Phisical Error - Missing Characters
// Error 2 : Phisical Error - Invalid Characters
// Error 3 : CRC Error (Could also be that the Code belongs to another player)
// Error 4 : Missing Bit (I doubt this will ever happen since 1,2,3 should give errors if there are missing bits
// Error 5 : Long process made thread quit!
//
function Codemaker_ReadCode takes player p, string cod returns integer
local string b=bj_lastPlayedMusic
set bj_lastPlayedMusic=cod
set bj_groupEnumOwningPlayer=p
call ExecuteFunc("Codemaker_ReadCode_thread")
// I don't want the trigger to halt execution because of too long process
set bj_lastPlayedMusic=b
return bj_groupEnumTypeId
endfunction
//=============================================================================================================
// Sets a new charmap, charmap 0 is initialized automatically when you call Codemaker_init,
// Using multiple charmaps is possible and might be good when you have different codes for
// different stuff in your map.
//
// Always init the charmaps at map initialization.
//
function Codemaker_SetCharmap takes integer id, string ch, integer FCSsize returns nothing
local gamecache g=Codemaker()
local integer i=0
local integer log=0
local integer p=1
local string c
local string k=I2S(id)
local integer EXITTHREAD
local string bin
if (FCSsize>30) then
call BJDebugMsg("|cffff0000Invalid FCS size: Must be <= 30")
call FlushGameCache(g)
set EXITTHREAD=EXITTHREAD
endif
call StoreBoolean(g,"charmaps",k,true)
loop
set c=SubString(ch,i,i+1)
exitwhen (c=="")
if (StringCase(c,true)==c) then
set c=c+"1"
endif
set i=i+1
if (i>p) then
set p=p*2
set log=log+1
endif
endloop
if (i!=p) then
call BJDebugMsg("|cffff0000Invalid charmap: Length must be a power of 2")
call FlushGameCache(g)
set EXITTHREAD=EXITTHREAD
endif
if (ModuloInteger(p,FCSsize)==0) then
call BJDebugMsg("|cffff0000Invalid charmap/FCS size: FCS size can't be a multiple of the number of bits per character")
call FlushGameCache(g)
set EXITTHREAD=EXITTHREAD
endif
set i=0
call StoreInteger(g,k,"FCS",FCSsize)
call StoreInteger(g,k+"bitsperchar","now",log)
loop
exitwhen (i>=p)
set bin=Codemaker_Int2BinStr(i,log)
set c=SubString(ch,i,i+1)
call StoreString(g,k+"bin2char",bin,c)
if (i==0) then
call StoreString(g,k+"bin2char","def",c)
endif
if (StringCase(c,true)==c) then
set c=c+"1"
endif
call StoreString(g,k+"char2bin",c,bin)
if (i==0) then
call StoreString(g,k+"char2bin","def",bin)
endif
set i=i+1
endloop
set g=null
endfunction
//=============================================================================================================
// Asks the player to input a string
//
function Codemaker_AskString takes player p, string prompt, string cmd, string canc, real timeout returns string
local gamecache g=Codemaker()
local trigger t=CreateTrigger()
local triggeraction ac=TriggerAddAction(t,function Codemaker_AskString_Child )
local string k= I2S( Codemaker_GetId(t) )
local string pk=I2S(GetPlayerId(p))
local string r
local timer x
loop
exitwhen not( GetStoredBoolean(g,pk,"notfree") )
call StoreBoolean(g,pk,"haltnow",true)
call TriggerSleepAction(0)
endloop
call StoreBoolean(g,pk,"notfree",true)
call DisplayTimedTextToPlayer(p,0,0,timeout,prompt)
call TriggerRegisterPlayerChatEvent(t,p,cmd,false)
call TriggerRegisterPlayerChatEvent(t,p,canc,true)
call StoreString(g,k,"cmd",cmd)
call StoreString(g,k,"prm",prompt)
call StoreString(g,k,"cnl",canc)
set x=CreateTimer()
call TimerStart(x,timeout,false,null)
loop
exitwhen HaveStoredString(g,k,"result") or (TimerGetRemaining(x)<=0) or GetStoredBoolean(g,pk,"haltnow")
call StoreReal(g,k,"rem",TimerGetRemaining(x))
call TriggerSleepAction(0)
endloop
call StoreBoolean(g,pk,"haltnow",false)
set r=GetStoredString(g,k,"result")
call FlushStoredMission( g,k)
call TriggerRemoveAction(t,ac)
call DestroyTrigger(t)
call DestroyTimer(x)
call StoreBoolean(g,pk,"notfree",false)
set x=null
set ac=null
set g=null
set t=null
return r
endfunction
//=============================================================================================================
// Initializes Charmap 0 (default)
//
function Codemaker_init takes nothing returns nothing
call Codemaker_SetCharmap(0,Codemaker_Charmap(),Codemaker_FCSsize())
endfunction
//=============================================================================================================
// Recolors input string, so Capital letters, Lower case letters and symbols have different colors
//
function Codemaker_HighlightCode takes string cod, string cColor, string lColor, string sColor returns string
local integer l=StringLength(cod)
local integer i=0
local string r=""
local string c
local string x
local boolean b
loop
exitwhen (i>=l)
set c=SubString(cod,i,i+1)
set x=""
loop
exitwhen (i>=l)
set b= (StringCase(c,true)==c) and (StringCase(c,false)!=c)
exitwhen not( b)
set x=x+c
set i=i+1
set c=SubString(cod,i,i+1)
endloop
if (x!="") then
set r=r+"|c"+cColor+x+"|r"
endif
set x=""
loop
exitwhen (i>=l)
set b= (StringCase(c,true)!=c) and (StringCase(c,false)==c)
exitwhen not ( b)
set x=x+c
set i=i+1
set c=SubString(cod,i,i+1)
endloop
if (x!="") then
set r=r+"|c"+lColor+x+"|r"
endif
set x=""
loop
exitwhen (i>=l)
set b= (StringCase(c,true)==c) and (StringCase(c,false)==c)
exitwhen not ( b)
set x=x+c
set i=i+1
set c=SubString(cod,i,i+1)
endloop
if (x!="") then
set r=r+"|c"+sColor+x+"|r"
endif
endloop
return r
endfunction
function Codemaker_Code2Serial takes string cod, string token , integer charspergroup, string cColor, string lColor, string sColor returns string
local integer i=charspergroup
local integer j=0
local gamecache g=Codemaker()
local string k=Codemaker_CurrentCharmap()
local integer b=GetStoredInteger(g,k+"bitsperchar","now")
local integer mx=R2I(Pow(2,b)-1)
local string r=""
local string c
loop
exitwhen (ModuloInteger(StringLength(cod),i)==0)
set cod=cod+GetStoredString(g,k+"bin2char", Codemaker_Int2BinStr(GetRandomInt(0,mx),b) )
endloop
loop
set c=SubString(cod,j,j+i)
exitwhen (c=="") or (c==null)
if (r=="") then
set r=Codemaker_HighlightCode(c,cColor,lColor,sColor)
else
set r=r+"-"+Codemaker_HighlightCode(c,cColor,lColor,sColor)
endif
set j=j+i
endloop
set g=null
return r
endfunction
function Codemaker_Serial2Code takes string serial, string token returns string
local string r=""
local string c=""
local integer i=0
loop
set c=SubString(serial,i,i+1)
exitwhen (c=="") or (c==null)
if (c!=token) then
set r=r+c
endif
set i=i+1
endloop
return r
endfunction
//=============================================================================================================
// Returns the required size to save a value if its maximum is i
//
function Codemaker_GetRequiredSize takes integer i returns integer
local integer p=1
local integer r=0
loop
exitwhen (p>i)
set r=r+1
set p=p*2
endloop
return r
endfunction
//##end##
Name | Type | is_array | initial_value |
AmmountofUnits | integer | Yes | |
ascii | gamecache | No | |
BossItems | itemcode | Yes | |
cach | gamecache | No | |
caster | unit | No | |
casters | group | No | |
castervars | real | Yes | |
codemaker | gamecache | No | |
codemaker_size | integer | Yes | |
codemaker_vals | integer | Yes | |
cscache | gamecache | No | |
currentabi | integer | No | |
currentcaster | unit | No | |
currenthurter | unit | No | |
DamageDisplay | integer | No | |
DeathP1 | integer | No | |
DeathP2 | integer | No | |
delayhack | real | No | |
DisplayText | group | No | |
Hero_levels | integer | Yes | |
herosave | gamecache | No | |
IntegerVar | integer | No | |
Items | itemcode | Yes | |
ItemsRandomizer | integer | No | |
Kills | integer | Yes | |
Kills2 | StringExt | Yes | |
MonsterDestRandomizer | integer | No | |
MonsterSpawn111213Dests | rect | Yes | |
MonsterSpawn12345Dests | rect | Yes | |
MonsterSpawn14_17Dests | rect | Yes | |
MonsterSpawn678910Dests | rect | Yes | |
MonsterTypes | unit | Yes | |
Multiboard | multiboard | No | |
Playersgroup | player | No | |
Plyr1herokills | real | No | |
Plyr1herounit | unit | No | |
Plyr1kills | real | No | |
Plyr2herokills | real | No | |
Plyr2herounit | unit | No | |
Plyr2kills | real | No | |
Plyr3kills | real | No | |
Plyr4kills | real | No | |
Plyr5kills | real | No | |
Plyr6kills | real | No | |
Plyr7kills | real | No | |
PointVar | location | No | |
poolclass | gamecache | No | |
potion | itemcode | No | |
RareMonsterDrops | itemcode | Yes | |
RealVar | real | No | |
ringstop | real | No | |
SoulSpheres_gold | integer | Yes | |
sourcehack | location | No | |
SpawnRegion | rect | Yes | |
targetpoint | rect | No | |
TemString | StringExt | No | |
tmInt | integer | No | |
tmp_point | location | No | |
tmPlayer | player | No | |
Units | unit | Yes | |
UnitVar | unit | No | |
Wood | integer | Yes | |
zz_ActionAndTrig | trigger | No | |
zz_AdjustCam | boolean | Yes | |
zz_ai_only_mode | button | No | |
zz_AllItems | item | Yes | |
zz_AllUnits | unit | Yes | |
zz_Anfangsfarbe | integer | Yes | |
zz_AnyDamageTrig | trigger | No | |
zz_AnzahlVoter | integer | No | |
zz_ATLastSound | sound | Yes | |
zz_AttackDiceUpgr | integer | Yes | |
zz_AttackRateUpgr | integer | Yes | |
zz_ATToBeSkipped | boolean | Yes | |
zz_BnsBit | integer | Yes | |
zz_CamAlreadyOff | boolean | Yes | |
zz_CamAngle | real | Yes | |
zz_CameraSettingVal | real | Yes | |
zz_CamFollowUnit | unit | Yes | |
zz_CamOffset | real | Yes | |
zz_CamPid | integer | Yes | |
zz_CamPidIndex | integer | No | |
zz_CamRoll | real | Yes | |
zz_CamRotation | real | Yes | |
zz_CamSysPlayer | player | No | |
zz_CamSysT | real | No | |
zz_CamSysTime | real | No | |
zz_CamZOffset | real | Yes | |
zz_cdlg_button | button | Yes | |
zz_cdlg_dialog | dialog | Yes | |
zz_cdlg_length | integer | No | |
zz_cdlg_number | integer | Yes | |
zz_chat_no_ally | string | No | |
zz_CheckLocation | location | No | |
zz_ClosestDestructable | destructable | No | |
zz_ClosestDistance | real | No | |
zz_ClosestItem | item | No | |
zz_CodeIdA | string | Yes | |
zz_CodeIdB | string | Yes | |
zz_CodeRow | string | No | |
zz_CodeRows | integer | Yes | |
zz_color_board | leaderboard | No | |
zz_command_dlg1 | string | Yes | |
zz_command_dlg2 | string | Yes | |
zz_command_dlg3 | string | Yes | |
zz_command_hotkey1 | integer | Yes | |
zz_command_hotkey2 | integer | Yes | |
zz_command_hotkey3 | integer | Yes | |
zz_command_key1 | string | Yes | |
zz_command_key2 | string | Yes | |
zz_command_key3 | string | Yes | |
zz_command_language | string | No | |
zz_command_length | integer | No | |
zz_command_msg | string | Yes | |
zz_command_number | integer | Yes | |
zz_command_par1 | integer | Yes | |
zz_command_par2 | integer | Yes | |
zz_command_par3 | integer | Yes | |
zz_command_prefix | string | No | |
zz_commanded_player | player | No | |
zz_commander_mode | button | No | |
zz_commanding_player | player | No | |
zz_Comp | boolean | No | |
zz_current_command | integer | No | |
zz_current_number_par | integer | No | |
zz_current_player_par | integer | No | |
zz_CurrentlySelectedHero | unit | Yes | |
zz_CustomBooleanValue | boolean | Yes | |
zz_CustomRealValue | real | Yes | |
zz_CustomStringValue | string | Yes | |
zz_DamageTaken | real | No | |
zz_debug_BlackMaskTrig | trigger | No | |
zz_debugCamAoaTrig | trigger | No | |
zz_debugCamDistTrig | trigger | No | |
zz_debugCamFarzTrig | trigger | No | |
zz_debugCamFovTrig | trigger | No | |
zz_debugCamInfoTrig | trigger | No | |
zz_debugCamResetTrig | trigger | No | |
zz_debugCamRollTrig | trigger | No | |
zz_debugCamRotTrig | trigger | No | |
zz_debugCloneTrig | trigger | No | |
zz_debugDemoTrig | trigger | No | |
zz_debugDifficultyTrig | trigger | No | |
zz_debugDispelTrig | trigger | No | |
zz_debugFingerOfDeathEnabled | boolean | Yes | |
zz_debugFingerOfDeathTrig | trigger | Yes | |
zz_debugGimmeTrig | trigger | No | |
zz_debugGotoUnits | integer | No | |
zz_debugGotoUnitTrig | trigger | No | |
zz_debugGotoUnitX | real | No | |
zz_debugGotoUnitY | real | No | |
zz_debugGotoXTrig | trigger | No | |
zz_debugGotoXYTrig | trigger | No | |
zz_debugGotoYTrig | trigger | No | |
zz_debugTeleportTrig | trigger | No | |
zz_debugToolOfDeathTrig | trigger | Yes | |
zz_debugUnitInfoTrig | trigger | No | |
zz_DefendCaster | sound | No | |
zz_DetectRandom | real | No | |
zz_DetectSelected | real | No | |
zz_deutsch_button | button | No | |
zz_dialog_in_use | boolean | No | |
zz_DialogAktion | string | Yes | |
zz_DialogButton | button | Yes | |
zz_DialogFolge | trigger | Yes | |
zz_DialogShortcut | integer | Yes | |
zz_DialogSpieler | dialog | Yes | |
zz_DivineShield | sound | No | |
zz_dlg_dialog | dialog | Yes | |
zz_dlg_length | integer | No | |
zz_dlg_string | string | Yes | |
zz_dlgbutton_ai_only | string | No | |
zz_dlgbutton_all | string | No | |
zz_dlgbutton_cancel | string | No | |
zz_dlgbutton_commander | string | No | |
zz_dlgbutton_gold | string | No | |
zz_dlgbutton_lumber | string | No | |
zz_dlgbutton_no_human | string | No | |
zz_dlgbutton_tribute | string | No | |
zz_dlghdr_choose_ally | string | No | |
zz_dlghdr_choose_number | string | No | |
zz_dlghdr_choose_player | string | No | |
zz_dlghdr_game_type | string | No | |
zz_dlghdr_root | string | No | |
zz_dlghdr_tribute_amount | string | No | |
zz_dlghdr_tribute_type | string | No | |
zz_Empty0p5 | sound | No | |
zz_Empty1 | sound | No | |
zz_Empty10 | sound | No | |
zz_Empty11 | sound | No | |
zz_Empty12 | sound | No | |
zz_Empty14 | sound | No | |
zz_Empty16 | sound | No | |
zz_Empty18 | sound | No | |
zz_Empty1p5 | sound | No | |
zz_Empty2 | sound | No | |
zz_Empty20 | sound | No | |
zz_Empty22 | sound | No | |
zz_Empty24 | sound | No | |
zz_Empty26 | sound | No | |
zz_Empty28 | sound | No | |
zz_Empty2p5 | sound | No | |
zz_Empty3 | sound | No | |
zz_Empty30 | sound | No | |
zz_Empty32 | sound | No | |
zz_Empty4 | sound | No | |
zz_Empty5 | sound | No | |
zz_Empty6 | sound | No | |
zz_Empty7 | sound | No | |
zz_Empty8 | sound | No | |
zz_Empty9 | sound | No | |
zz_EngineTimerDialogs | timerdialog | Yes | |
zz_EngineTimers | timer | Yes | |
zz_english_button | button | No | |
zz_EnumItemType | integer | No | |
zz_EnumItemTypeT | itemtype | No | |
zz_ErweckteIndex | integer | No | |
zz_ErweckteKreaturen | unit | Yes | |
zz_Farbinterval | real | Yes | |
zz_ForRectItem | boolean | No | |
zz_french_button | button | No | |
zz_game_start_dialog | dialog | No | |
zz_game_start_trigger | trigger | No | |
zz_GewitterBlitze | integer | No | |
zz_GewitterCenter | location | No | |
zz_GlowEffect | effect | Yes | |
zz_GlowEffectPlus | effect | Yes | |
zz_heap_array_0 | integer | Yes | |
zz_heap_array_1 | integer | Yes | |
zz_heap_array_2 | integer | Yes | |
zz_heap_array_begin | integer | No | |
zz_heap_array_end | integer | No | |
zz_heap_arraycount | integer | No | |
zz_heap_descriptor_alloccursor | integer | No | |
zz_heap_descriptor_array_0 | integer | Yes | |
zz_heap_descriptor_array_1 | integer | Yes | |
zz_heap_descriptor_arraycount | integer | No | |
zz_heap_descriptor_begin | integer | No | |
zz_heap_descriptor_end | integer | No | |
zz_heap_descriptor_first | integer | No | |
zz_heap_descriptor_last | integer | No | |
zz_heap_descriptor_record_size | integer | No | |
zz_HeroChoice | trigger | No | |
zz_HeroDiedMsg | trigger | No | |
zz_HeroSkill1 | integer | Yes | |
zz_HeroSkill2 | integer | Yes | |
zz_HeroSkill3 | integer | Yes | |
zz_HeroSkill4 | integer | Yes | |
zz_HeroSkill5 | integer | Yes | |
zz_IsAlreadyPathing | boolean | Yes | |
zz_ItemIndex | integer | No | |
zz_language_dialog | dialog | No | |
zz_language_trigger | trigger | No | |
zz_LastClickedButtonNr | integer | Yes | |
zz_LastCreatedMovingSFX | integer | No | |
zz_LastCreatedMultiboardItem | multiboarditem | No | |
zz_LastMidiSound | sound | No | |
zz_LastMultipleChoice | integer | Yes | |
zz_LifeRegenUpgr | integer | Yes | |
zz_ManaRegenUpgr | integer | Yes | |
zz_MissileLength | integer | No | |
zz_MissileModel | string | Yes | |
zz_MissileOrder | string | Yes | |
zz_MissileUnitType | integer | Yes | |
zz_MJAuswahl | boolean | Yes | |
zz_MJAuswahleinheit | unit | Yes | |
zz_MJLastSound | sound | Yes | |
zz_MJPlayerPointer | integer | No | |
zz_MJSelected | group | Yes | |
zz_MJTrig1 | trigger | Yes | |
zz_MJTrig2 | trigger | Yes | |
zz_ModuloHex | integer | No | |
zz_MoveRateUpgr | integer | Yes | |
zz_MovForward | trigger | No | |
zz_MovingSFX | effect | Yes | |
zz_MovingSFXAbstand | real | Yes | |
zz_MovingSFXCenter | location | Yes | |
zz_MovingSFXCounter | integer | Yes | |
zz_MovingSFXKilled | boolean | Yes | |
zz_MovingSFXLength | integer | No | |
zz_MovingSFXLoop | boolean | Yes | |
zz_MovingSFXNach | rect | Yes | |
zz_MovingSFXNr | integer | Yes | |
zz_MovingSFXPath | string | Yes | |
zz_MovingSFXRadius | real | Yes | |
zz_MovingSFXStartAngle | real | Yes | |
zz_MovingSFXTrigger | trigger | Yes | |
zz_MovingSFXType | integer | Yes | |
zz_MovingSFXUnit | unit | Yes | |
zz_MovingSFXVor | rect | Yes | |
zz_MovingSFXWait | real | Yes | |
zz_MovLeft | integer | Yes | |
zz_MovMoving | boolean | Yes | |
zz_MovRight | integer | Yes | |
zz_MovSidewards | trigger | No | |
zz_MovUnit | unit | Yes | |
zz_ndbn_button | button | Yes | |
zz_ndbn_length | integer | No | |
zz_no_human_mode | button | No | |
zz_NoBuildIndex | integer | No | |
zz_NoBuildRects | rect | Yes | |
zz_NoBuildTrig | trigger | No | |
zz_number_dialog | dialog | No | |
zz_observer_god | boolean | No | |
zz_parsed_command | string | Yes | |
zz_pcbn_button | button | Yes | |
zz_pcbn_length | integer | No | |
zz_pcbn_number | integer | Yes | |
zz_player_dialog | dialog | No | |
zz_PlayerLeftMsg | trigger | No | |
zz_PortaleffektA | effect | Yes | |
zz_PortaleffektB | effect | No | |
zz_PortaltriggerA | trigger | No | |
zz_PortaltriggerB | trigger | No | |
zz_PressDown | trigger | No | |
zz_PressLeft | trigger | No | |
zz_PressRight | trigger | No | |
zz_PressUp | trigger | No | |
zz_PrevCam | camerasetup | Yes | |
zz_RangeUpgr | integer | Yes | |
zz_RegrowingTrees | trigger | No | |
zz_ReleaseLeft | trigger | No | |
zz_ReleaseRight | trigger | No | |
zz_ReleaseUp | trigger | No | |
zz_root_dialog | dialog | No | |
zz_SaveLoadSettings | boolean | Yes | |
zz_sdbn_button | button | Yes | |
zz_sdbn_length | integer | No | |
zz_sdbn_number | integer | Yes | |
zz_SEAnzahl | integer | No | |
zz_SECaster | unit | No | |
zz_SECastingType | integer | Yes | |
zz_SEFunc | string | Yes | |
zz_SEId | integer | Yes | |
zz_SEIndex | integer | No | |
zz_SELastOrder | string | No | |
zz_SelectableHeros | group | No | |
zz_SEMana | real | Yes | |
zz_SEOrder | string | Yes | |
zz_SERange | real | Yes | |
zz_SETarget | unit | No | |
zz_SETX | real | No | |
zz_SETY | real | No | |
zz_ShortcutId | string | Yes | |
zz_start_dialog | dialog | No | |
zz_StimmeAbgegeben | boolean | Yes | |
zz_Stimmen | integer | Yes | |
zz_StimmenAbgabe | trigger | No | |
zz_StimmenAbgegeben | integer | No | |
zz_StringIdent | string | No | |
zz_swedish_button | button | No | |
zz_TargetDistance | real | Yes | |
zz_TargetUpgr | integer | Yes | |
zz_TimerCounter | integer | No | |
zz_TPCenter | rect | No | |
zz_TPCondition | triggercondition | Yes | |
zz_TPEingang | rect | Yes | |
zz_TPNextTown | rect | No | |
zz_TPOpen | boolean | Yes | |
zz_TPPointer | integer | No | |
zz_TPRestrictGroup | group | No | |
zz_TPRestrictType | integer | No | |
zz_TPWatchersA | real | No | |
zz_TPWatchersB | real | No | |
zz_tribute_amount | string | No | |
zz_tribute_dlg | dialog | No | |
zz_tribute_dlg_button | button | Yes | |
zz_tribute_dlg_length | integer | No | |
zz_tribute_g | button | No | |
zz_tribute_l | button | No | |
zz_tribute_type | string | No | |
zz_TrigAlways | trigger | No | |
zz_UnfertigeGebaeude | unit | Yes | |
zz_UnfertigeGebIndex | integer | No | |
zz_UnfertigeUpgrades | unit | Yes | |
zz_UnfertigeUpgradesIndex | integer | No | |
zz_UnitIndex | integer | No | |
zz_UseAngle | boolean | Yes | |
zz_UseDistance | boolean | Yes | |
zz_UseOffset | boolean | Yes | |
zz_UseRoll | boolean | Yes | |
zz_UseRotation | boolean | Yes | |
zz_UseZOffset | boolean | Yes | |
zz_VotingAuswahl | string | Yes | |
zz_VotingBoard | leaderboard | Yes | |
zz_VotingErgebnis | string | No | |
zz_VotingFolge | string | Yes | |
zz_VotingGeheim | boolean | No | |
zz_VotingTimer | timerdialog | No | |
zz_XAcquiredItem | item | Yes | |
zz_XBuiltConstruction | unit | Yes | |
zz_XDroppedItem | item | Yes | |
zz_XLearnedSkill | integer | Yes | |
zz_XResearchedUpgrade | integer | Yes | |
zz_XSoldItem | item | Yes | |
zz_XSoldUnit | unit | Yes | |
zz_XSummonedUnit | unit | Yes | |
zz_XTrainedUnit | unit | Yes |
//===========================================================================
function InitTrig_Init_Code_Maker takes nothing returns nothing
call Codemaker_init()
//
// Required on the map's initialization so the default charmap is initialized correctly
//
endfunction
function HeroSave_InitializeObjects takes nothing returns nothing
local integer H=CreatePool()
local integer I=CreatePool()
local integer A=CreatePool()
//===============================================================================================
// Hero Type Pool
//
call PoolAddItem(H,'Hblm') //Blood Mage
call PoolAddItem(H,'Hamg') //Arch Mage
call PoolAddItem(H,'Nfir') //Fire Lord
//===============================================================================================
// Item Type Pool
//
call PoolAddRawcodes(I,"ankh;I00B;I005;I006;I004;l002;l003")
call PoolAddRawcodes(I,"I001;I009;I008;I00D;I00E;I00H;I00F;I00C;I00G;I00O;I00G")
call PoolAddRawcodes(I,"I00L;I00M;I00P;I00C;I00K;I00J;I00N;I00F")
call PoolAddRawcodes(I,"I00I;I00T;I00Q;I00R;I00S;I00U")
//===============================================================================================
// Ability Pool (only abilities that might be on saveable heroes and you'd want to save)
//
call PoolAddRawcodes(A,"AHbz;AHwe;AHab;AHmt" ) //Arch Mage's
call PoolAddRawcodes(A,"AHfs;AHpx;AHbn;AHdr" ) //Blood Mage's
call PoolAddRawcodes(A,"ANvc;ANlm;ANso;ANia;ANic" ) //Fire Lord's
//They don't need to be grouped by heroes
call PoolAddItem(A,'Aslo') //Slow
call PoolAddItem(A,'Adis') //Dispel Magic
call StartHeroSave(H,I,A)
endfunction
//===========================================================================
function InitTrig_Initialize_Objects_C takes nothing returns nothing
call ExecuteFunc("HeroSave_InitializeObjects")
endfunction
function HeroSave_InitializeObjects takes nothing returns nothing
local integer H=CreatePool()
local integer I=CreatePool()
local integer A=CreatePool()
//===============================================================================================
// Hero Type Pool
//
call PoolAddItem(H,'H002') //Dark1
call PoolAddItem(H,'H00A') //Dark2
call PoolAddItem(H,'H008') //Dark3
call PoolAddItem(H,'H009') //Dark4
call PoolAddItem(H,'H00B') //Earth1
call PoolAddItem(H,'H003') //Earth2
call PoolAddItem(H,'H00L') //Earth3
call PoolAddItem(H,'H00K') //Earth4
call PoolAddItem(H,'H005') //Fire1
call PoolAddItem(H,'H00M') //Fire2
call PoolAddItem(H,'H00C') //Fire3
call PoolAddItem(H,'H00Q') //Fire4
call PoolAddItem(H,'H00D') //Light1
call PoolAddItem(H,'H007') //Light2
call PoolAddItem(H,'H00N') //Light3
call PoolAddItem(H,'H00R') //Light4
call PoolAddItem(H,'H006') //Water1
call PoolAddItem(H,'H00E') //Water2
call PoolAddItem(H,'H00O') //Water3
call PoolAddItem(H,'H00S') //Water4
call PoolAddItem(H,'H00F') //Wind1
call PoolAddItem(H,'H004') //Wind2
call PoolAddItem(H,'H00T') //Wind3
call PoolAddItem(H,'H00P') //Wind4
call PoolAddItem(H,'U00G') //Spirit1
call PoolAddItem(H,'U00E') //Spirit2
call PoolAddItem(H,'U00K') //Spirit3
call PoolAddItem(H,'U00L') //Spirit4
//===============================================================================================
// Item Type Pool
//
call PoolAddRawcodes(I,"ankh;I00V;I00Z;I00W;I00X;I00Y;I00B;I005;I006;I004;I010;I002;I003;I001")
call PoolAddRawcodes(I,"I009;I008;I00D;I00E;I00H;I00O;I00G;I00L;I00M;I00P;I00C;I00J;I00K;I00N")
call PoolAddRawcodes(I,"I00F;I00T;I00S;I00U;I00Q;I00R;I00I;I011;I014;I012;I013;I015;I01C;I016")
call PoolAddRawcodes(I,"I01A;I01B")
//===============================================================================================
// Ability Pool (only abilities that might be on saveable heroes and you'd want to save)
//
call PoolAddRawcodes(A,"A01L;A010;A013;A033;A034;A003;A004;A016;A02Z;A018;A02V;A02W;A01G;A017" )
call PoolAddRawcodes(A,"A001;A02X;A02Y;A00T;A00U;A00V;A00W;A00X;A00F;A037;A037;A039;A036;A030" )
call PoolAddRawcodes(A,"A01K;A03F;A03E;A002;A019;A029;A028;A00Z;A02A;A02B;A01A;A00P;A02D;A02C" )
call PoolAddRawcodes(A,"A02E;A00M;A02G;A00O;A02F;A02H;A01B;A00E;A02I;A02J;A01C;A00Y;A02L;A02K" )
call PoolAddRawcodes(A,"A02M;A02N;A00N;A020;A011;A02P;A02Q;A02R;A00Q;A03A;A03B;A03C;A012;A02S" )
call PoolAddRawcodes(A,"A02T;A02U;A00S;A03H;A03I;A03J;A03G;A03L;A03M;A03N;A03K;A03S;A03O;A03R" )
call PoolAddRawcodes(A,"A03W;A00Y;A02L;A02K;A045;A042;A043;A044;A03P;A03R;A03X;A03Y;A014" )
//They don't need to be grouped by heroes
call PoolAddItem(A,'Aslo') //Slow
call PoolAddItem(A,'Adis') //Dispel Magic
call StartHeroSave(H,I,A)
endfunction
//===========================================================================
function InitTrig_Initialize_Objects_C_Copy_2 takes nothing returns nothing
call ExecuteFunc("HeroSave_InitializeObjects")
endfunction
function HeroSave_InitializeObjects takes nothing returns nothing
local integer H=CreatePool()
local integer I=CreatePool()
local integer A=CreatePool()
//===============================================================================================
// Hero Type Pool
//
call PoolAddItem(H,'H002') //Dark1
call PoolAddItem(H,'H00A') //Dark2
call PoolAddItem(H,'H008') //Dark3
call PoolAddItem(H,'H009') //Dark4
call PoolAddItem(H,'H00B') //Earth1
call PoolAddItem(H,'H003') //Earth2
call PoolAddItem(H,'H00L') //Earth3
call PoolAddItem(H,'H00K') //Earth4
call PoolAddItem(H,'H005') //Fire1
call PoolAddItem(H,'H00M') //Fire2
call PoolAddItem(H,'H00C') //Fire3
call PoolAddItem(H,'H00Q') //Fire4
call PoolAddItem(H,'H00D') //Light1
call PoolAddItem(H,'H007') //Light2
call PoolAddItem(H,'H00N') //Light3
call PoolAddItem(H,'H00R') //Light4
call PoolAddItem(H,'H006') //Water1
call PoolAddItem(H,'H00E') //Water2
call PoolAddItem(H,'H00O') //Water3
call PoolAddItem(H,'H00S') //Water4
call PoolAddItem(H,'H00F') //Wind1
call PoolAddItem(H,'H004') //Wind2
call PoolAddItem(H,'H00T') //Wind3
call PoolAddItem(H,'H00P') //Wind4
call PoolAddItem(H,'U00G') //Spirit1
call PoolAddItem(H,'U00E') //Spirit2
call PoolAddItem(H,'U00K') //Spirit3
call PoolAddItem(H,'U00L') //Spirit4
//===============================================================================================
// Item Type Pool
//
call PoolAddRawcodes(I,"ankh;I00V;I00Z;I00W;I00X;I00Y;I00B;I005;I006;I004;I010;I002;I003;I001")
call PoolAddRawcodes(I,"I009;I008;I00D;I00E;I00H;I00O;I00G;I00L;I00M;I00P;I00C;I00J;I00K;I00N")
call PoolAddRawcodes(I,"I00F;I00T;I00S;I00U;I00Q;I00R;I00I;I011;I014;I012;I013;I015;I01C;I016")
call PoolAddRawcodes(I,"I01A;I01B")
//===============================================================================================
// Ability Pool (only abilities that might be on saveable heroes and you'd want to save)
//
call PoolAddRawcodes(A,"A01L;A010;A013;A033;A034;A003;A004;A016;A02Z;A018;A02V;A02W;A01G;A017" )
call PoolAddRawcodes(A,"A001;A02X;A02Y;A00T;A00U;A00V;A00W;A00X;A00F;A037;A037;A039;A036;A030" )
call PoolAddRawcodes(A,"A01K;A03F;A03E;A002;A019;A029;A028;A00Z;A02A;A02B;A01A;A00P;A02D;A02C" )
call PoolAddRawcodes(A,"A02E;A00M;A02G;A00O;A02F;A02H;A01B;A00E;A02I;A02J;A01C;A00Y;A02L;A02K" )
call PoolAddRawcodes(A,"A02M;A02N;A00N;A020;A011;A02P;A02Q;A02R;A00Q;A03A;A03B;A03C;A012;A02S" )
call PoolAddRawcodes(A,"A02T;A02U;A00S;A03H;A03I;A03J;A03G;A03L;A03M;A03N;A03K;A03S;A03O;A03R" )
call PoolAddRawcodes(A,"A03W;A00Y;A02L;A02K;A045;A042;A043;A044;A03P;A03R;A03X;A03Y;A014" )
//They don't need to be grouped by heroes
call PoolAddItem(A,'Aslo') //Slow
call PoolAddItem(A,'Adis') //Dispel Magic
call StartHeroSave(H,I,A)
endfunction
//===========================================================================
function InitTrig_Initialize_Objects_C_Copy takes nothing returns nothing
call ExecuteFunc("HeroSave_InitializeObjects")
endfunction
function InitTrig_Hero_Save_Functions takes nothing returns nothing
endfunction
//##Start##
//*************************************************************************************************
//*
//* Hero Save/Load Functions
//*
//*************************************************************************************************
//=================================================================================================
constant function HeroSave_MaxHeroLevel takes nothing returns integer
return 1000
endfunction
constant function HeroSave_MaxHeroStat takes nothing returns integer
return 2000
endfunction
constant function HeroSave_MaxItemCharges takes nothing returns integer
return 20
endfunction
constant function HeroSave_MaxAbilityLevels takes nothing returns integer
return 100
endfunction
constant function HeroSave_MaxFreeSkillPoints takes nothing returns integer
return 100
endfunction
constant function HeroSave_LinkSize takes nothing returns integer
return 2
endfunction
constant function HeroSave_mapversion takes nothing returns integer
return 5
//
// Increase this with a 1 on every (official) map update that changes the objects, contents of
// the pools, so codes from previous versions can't be restored (Since they would probably cause
// messy results)
//
// very Big values would cause code increasement, another option is changing the charmap
// on every update.
//
endfunction
//=================================================================================================
function HeroSave takes nothing returns gamecache
if (udg_herosave==null) then
call FlushGameCache(InitGameCache("herosave"))
set udg_herosave=InitGameCache("herosave")
endif
return udg_herosave
endfunction
function StartHeroSave takes integer heroes, integer items, integer abils returns nothing
local gamecache g=HeroSave()
local integer x
call StoreInteger(g,"Constants","herolevelsize", Codemaker_GetRequiredSize(HeroSave_MaxHeroLevel()) )
set x=CountItemsInPool(heroes)-1 //Pool positions start with 1, but we'll use numbers from 0
call StoreInteger(g,"Constants","herosize",Codemaker_GetRequiredSize(x))
set x=CountItemsInPool(items)-1 //Pool positions start with 1, but we'll use numbers from 0
call StoreInteger(g,"Constants","itemsize",Codemaker_GetRequiredSize(x))
call StoreInteger(g,"Constants","itemNsize",Codemaker_GetRequiredSize(bj_MAX_INVENTORY))
set x=CountItemsInPool(abils)-1 //Pool positions start with 1, but we'll use numbers from 0
call StoreInteger(g,"Constants","abilsize",Codemaker_GetRequiredSize(x)+1)
call StoreInteger(g,"Constants","chargsize",Codemaker_GetRequiredSize(HeroSave_MaxItemCharges()))
call StoreInteger(g,"Constants","levelsize",Codemaker_GetRequiredSize(HeroSave_MaxAbilityLevels()))
call StoreInteger(g,"Constants","skillsize",Codemaker_GetRequiredSize(HeroSave_MaxFreeSkillPoints()))
call StoreInteger(g,"Constants","statssize",Codemaker_GetRequiredSize(HeroSave_MaxHeroStat()))
call StoreInteger(g,"pools","heroes",heroes)
call StoreInteger(g,"pools","items",items)
call StoreInteger(g,"pools","abils",abils)
set g=null
endfunction
function HeroSave_BrowseAbilities takes nothing returns nothing
local integer p=CreatePool()
local integer i=1
local integer ap=GetStoredInteger(HeroSave(),"pools","abils")
local integer a
local integer n=CountItemsInPool(ap)
local unit u=bj_groupRandomCurrentPick
set udg_codemaker_vals[9]=p
loop
exitwhen (i>n)
set a=PoolGetItem(ap,i)
if (GetUnitAbilityLevel(u,a)>0) then
call PoolAddItem(p,a)
endif
set i=i+1
endloop
set u=null
endfunction
function HeroSave_SaveHero takes unit hero returns string
//It Actually uses 2 codes!, first code is always of the same size, but contains information for
//the size of second code, which holds abilities and items, a random link value is added to both
//So if they don't match it dies.
//
local integer link=GetRandomInt(0,R2I( Pow(2,HeroSave_LinkSize())-1 ))
local gamecache g=HeroSave()
local string r
local integer p=GetStoredInteger(g,"pools","heroes")
local integer ap
local integer a
local integer aN
local integer iN
local integer x
local integer y
local integer i
local item it
set udg_codemaker_vals[0]=10
//Link · Version · Type · Level · Skillpoints · Int · Agi · Str · AbilN · ItemN
set udg_codemaker_size[1]=HeroSave_LinkSize()
set udg_codemaker_vals[1]=link
set udg_codemaker_size[2]=Codemaker_GetRequiredSize(HeroSave_mapversion())
set udg_codemaker_vals[2]=HeroSave_mapversion()
set udg_codemaker_size[3]=GetStoredInteger(g,"Constants","herosize")
set udg_codemaker_vals[3]=GetItemPositionInPool(p,GetUnitTypeId(hero)) - 1
set udg_codemaker_size[4]=GetStoredInteger(g,"Constants","herolevelsize")
set udg_codemaker_vals[4]=GetHeroLevel(hero)
set udg_codemaker_size[5]=GetStoredInteger(g,"Constants","skillsize")
set udg_codemaker_vals[5]=IMinBJ(HeroSave_MaxFreeSkillPoints(),GetHeroSkillPoints(hero))
set x=GetStoredInteger(g,"Constants","statssize")
set udg_codemaker_size[6]=x
set udg_codemaker_vals[6]=GetHeroInt(hero,false)
set udg_codemaker_size[7]=x
set udg_codemaker_vals[7]=GetHeroAgi(hero,false)
set udg_codemaker_size[8]=x
set udg_codemaker_vals[8]=GetHeroStr(hero,false)
set bj_groupRandomCurrentPick=hero
call ExecuteFunc("HeroSave_BrowseAbilities")
set ap=udg_codemaker_vals[9]
set aN=CountItemsInPool(ap)
set iN=UnitInventoryCount(hero)
set x=GetStoredInteger(g,"Constants","abilsize")
set udg_codemaker_size[9]=x
set udg_codemaker_vals[9]=aN
set udg_codemaker_size[10]=GetStoredInteger(g,"Constants","itemNsize")
set udg_codemaker_vals[10]=iN
set r=Codemaker_GenerateCode(GetOwningPlayer(hero))
//First Code done, now the second one...
set udg_codemaker_vals[0]=1+(aN+iN)*2
set udg_codemaker_size[1]=HeroSave_LinkSize()
set udg_codemaker_vals[1]=link
set y=GetStoredInteger(g,"Constants","levelsize")
set i=1
set p=GetStoredInteger(g,"pools","abils")
loop
exitwhen (aN<=0)
set i=i+1
//Ability
set udg_codemaker_size[i]=x
set a=PoolGetItem(ap,aN)
set udg_codemaker_vals[i]=GetItemPositionInPool(p,a)-1
set i=i+1
//Level
set udg_codemaker_size[i]=y
set udg_codemaker_vals[i]=GetUnitAbilityLevel(hero,a)
set aN=aN-1
endloop
set iN=0
set x=GetStoredInteger(g,"Constants","itemsize")
set y=GetStoredInteger(g,"Constants","chargsize")
set p=GetStoredInteger(g,"pools","items")
loop
exitwhen iN>=bj_MAX_INVENTORY
set it=UnitItemInSlot(hero,iN)
if (it!=null) then
set i=i+1
set udg_codemaker_size[i]=x
set udg_codemaker_vals[i]=GetItemPositionInPool(p,GetItemTypeId(it))-1
set i=i+1
set udg_codemaker_size[i]=y
set udg_codemaker_vals[i]=GetItemCharges(it)
endif
set iN=iN+1
endloop
call DestroyPool(ap)
set r=r+Codemaker_GenerateCode(GetOwningPlayer(hero))
//All is done
set g=null
set it=null
return r
endfunction
function HeroSave_LoadHero takes player owner, string cod, real px, real py, real f returns integer
local unit u
local integer link
local gamecache g=HeroSave()
local string r
local integer p=GetStoredInteger(g,"pools","heroes")
local integer ap
local integer a
local integer aN
local integer iN
local integer x
local integer y
local integer i
local item it
local integer error
set udg_codemaker_vals[0]=10
//Link · Version · Type · Level · Skillpoints · Int · Agi · Str · AbilN · ItemN
//Prepare Sizes for first code:
set udg_codemaker_size[1]=HeroSave_LinkSize()
set udg_codemaker_size[2]=Codemaker_GetRequiredSize(HeroSave_mapversion())
set udg_codemaker_size[3]=GetStoredInteger(g,"Constants","herosize")
set udg_codemaker_size[4]=GetStoredInteger(g,"Constants","herolevelsize")
set udg_codemaker_size[5]=GetStoredInteger(g,"Constants","skillsize")
set x=GetStoredInteger(g,"Constants","statssize")
set udg_codemaker_size[6]=x
set udg_codemaker_size[7]=x
set udg_codemaker_size[8]=x
set x=GetStoredInteger(g,"Constants","abilsize")
set udg_codemaker_size[9]=x
set udg_codemaker_size[10]=GetStoredInteger(g,"Constants","itemNsize")
set y=Codemaker_TotalCodeLength()
set error=Codemaker_ReadCode(owner,SubString(cod,0,y))
if (error>0) then
set g=null
return error
endif
if (udg_codemaker_vals[2]!=HeroSave_mapversion()) then
set g=null
return 10 //Invalid Map Version?
endif
set cod=SubString(cod,y,StringLength(cod))
set link=udg_codemaker_vals[1]
set u=CreateUnit(owner,PoolGetItem(p,udg_codemaker_vals[3]+1),px,py,f)
set bj_lastCreatedUnit=u
call SetHeroLevelBJ(u,udg_codemaker_vals[4], false)
call ModifyHeroSkillPoints(u,bj_MODIFYMETHOD_SET,udg_codemaker_vals[5])
call SetHeroInt(u,udg_codemaker_vals[6],true)
call SetHeroAgi(u,udg_codemaker_vals[7],true)
call SetHeroStr(u,udg_codemaker_vals[8],true)
set aN=udg_codemaker_vals[9]
set iN=udg_codemaker_vals[10]
//Done loading stuff from first code
//Prepare Second one:
set udg_codemaker_vals[0]=1+(aN+iN)*2
set udg_codemaker_size[1]=HeroSave_LinkSize()
set i=1
set error=GetStoredInteger(g,"Constants","levelsize")
set y=aN
loop
exitwhen (y<=0)
set i=i+1
set udg_codemaker_size[i]=x //Ability
set i=i+1
set udg_codemaker_size[i]=error //Level
set y=y-1
endloop
set y=iN
set x=GetStoredInteger(g,"Constants","itemsize")
set error=GetStoredInteger(g,"Constants","chargsize")
loop
exitwhen (y<=0)
set i=i+1
set udg_codemaker_size[i]=x //Item
set i=i+1
set udg_codemaker_size[i]=error //Charge
set y=y-1
endloop
set error=Codemaker_ReadCode(owner,cod)
if (error>0) then
call RemoveUnit(u)
set u=null
set g=null
return error*100
endif
if (udg_codemaker_vals[1]!=link) then
call RemoveUnit(u)
set u=null
set g=null
return 11 //Links don't match
endif
set i=1
set p=GetStoredInteger(g,"pools","abils")
//Time to load abilities
loop
exitwhen (aN<=0)
set i=i+1
set a=PoolGetItem(p,udg_codemaker_vals[i]+1)
call UnitAddAbility(u,a)
set i=i+1
call SetUnitAbilityLevel(u,a,udg_codemaker_vals[i])
set aN=aN-1
endloop
set p=GetStoredInteger(g,"pools","items")
loop
exitwhen (iN<=0)
set i=i+1
set it=UnitAddItemById(u,PoolGetItem(p,udg_codemaker_vals[i]+1))
set i=i+1
call SetItemCharges(it,udg_codemaker_vals[i])
set iN=iN-1
endloop
set u=null
set g=null
set it=null
return 0
endfunction
function HeroSave_LoadHeroLoc takes player owner, string cod, location loc, real f returns integer
return HeroSave_LoadHero(owner,cod,GetLocationX(loc),GetLocationY(loc),f)
endfunction
//=================================================================================================
//##End##
//RAWCODE FUNCTIONS
constant function WovenTouch_Light takes nothing returns integer
return 'h00J' //Rawcode of Woven Touch Light dummy unit
endfunction
constant function WovenTouch_Code takes nothing returns integer
return 'A01L' //Rawcode of Woven Touch Spell
endfunction
constant function WovenTouch_Dist takes nothing returns real
return 75.00 //Distance between lights and caster
endfunction
constant function WovenTouch_LightNumber takes nothing returns integer
return 6//Number of Lights
endfunction
constant function WovenTouch_Radius takes nothing returns real
return 1000.00 //Radius to pick next target of shield
endfunction
constant function WovenTouch_Duration takes nothing returns real
return 30.00 //Stationary time on unit
endfunction
constant function WovenTouch_Effect takes nothing returns string
return "Abilities\\Spells\\NightElf\\Rejuvenation\\RejuvenationTarget.mdl" //Change this to effect path
endfunction
constant function WovenTouch_Heal takes nothing returns real
return 1000.00 //Amount of life that can be healed per level
endfunction
constant function WovenTouch_ManaCost takes nothing returns real
return 95.00 //Mana Cost of Woven Touch
endfunction
//*************************************************************
//CONDITIONAL FUNCTIONS
function WovenTouchCond takes nothing returns boolean
return GetSpellAbilityId()==WovenTouch_Code()
endfunction
function WovenTouch_SeekCond takes nothing returns boolean
return IsUnitAlly(GetFilterUnit(), GetOwningPlayer(GetTriggerUnit())) and not(GetFilterUnit()==GetHandleUnit(GetTriggerUnit(), "WovenTarg")) and (GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE)>0 and (IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE))==false and IsUnitType(GetEnumUnit(),UNIT_TYPE_MECHANICAL)==false and IsUnitType(GetFilterUnit(),UNIT_TYPE_FLYING))==false and IsUnitType(GetFilterUnit(),UNIT_TYPE_MAGIC_IMMUNE)==false and GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE)<GetUnitState(GetFilterUnit(), UNIT_STATE_MAX_LIFE) and GetUnitAbilityLevel(GetFilterUnit(), 'Aloc')<=0 and GetHandleHandle(GetFilterUnit(), "light")==null
endfunction
function WovenTouchCondStop takes nothing returns boolean
return WovenTouchCond() and GetHandleHandle(GetTriggerUnit(), "light")!=null
endfunction
//**************************************************************
//ACTION FUNCTIONS
function WovenTouch_DestroyLights takes nothing returns nothing
//Eliminate the lights
call RemoveUnit(GetEnumUnit())
endfunction
function WovenTouch_MoveLights takes nothing returns nothing
//Moves the lights
local timer t = GetExpiredTimer()
local unit u = GetEnumUnit()
local unit targ = GetHandleUnit(t, "rotation")
local real x1 = GetUnitX(u)
local real y1 = GetUnitY(u)
local real x2 = GetUnitX(targ)
local real y2 = GetUnitY(targ)
local real angle = GetHandleReal(u, "angle") + .15
call SetUnitPosition(u, x2+WovenTouch_Dist()*Cos(angle), y2+WovenTouch_Dist()*Sin(angle))
call SetHandleReal(u, "angle", angle)
set t = null
set u = null
set targ = null
endfunction
function WovenTouch_Clock takes nothing returns nothing
//Activates the movement of the lights
local timer t = GetExpiredTimer()
local unit u = GetHandleUnit(t, "rotation")
local group g = GetHandleGroup(u, "light")
call ForGroup(g, function WovenTouch_MoveLights)
set g = null
set u = null
set t = null
endfunction
function WovenTouch_SeekTarget takes unit u returns unit
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local group g = CreateGroup()
call SetHandleHandle(GetTriggerUnit(), "WovenTarg", u)
call GroupEnumUnitsInRange(g,x,y,WovenTouch_Radius(),Condition(function WovenTouch_SeekCond))
call SetHandleHandle(GetTriggerUnit(), "WovenTarg", null)
return GetGroupUnitMinLife(g)
endfunction
function WovenTouchHeal takes nothing returns nothing
local group g = GetHandleGroup(GetExpiredTimer(), "light")
local unit targ = GetHandleUnit(g, "target")
local real life = GetHandleReal(g, "heal")
if GetUnitState(targ, UNIT_STATE_LIFE)>0 then
call SetUnitState(targ, UNIT_STATE_LIFE, GetUnitState(targ, UNIT_STATE_LIFE)+1.25)
call SetHandleReal(g, "heal", life-1.25)
endif
if (GetUnitState(targ, UNIT_STATE_LIFE)==GetUnitState(targ, UNIT_STATE_MAX_LIFE)) or life-2.00<=0.00 or GetUnitState(targ, UNIT_STATE_LIFE)<=0 then
call FlushHandleLocals(GetExpiredTimer())
call PauseTimer(GetExpiredTimer())
call DestroyTimer(GetExpiredTimer())
endif
set targ = null
set g = null
endfunction
function WovenTouchTarget takes unit u returns nothing
//Healing!
local group g = GetHandleGroup(u, "light")
local timer t = CreateTimer()
local effect e = AddSpecialEffectTarget(WovenTouch_Effect(), u, "chest")
call SetHandleHandle(t, "light", g)
call SetHandleHandle(g, "target", u)
call TimerStart(t, 0.035, true, function WovenTouchHeal)
loop
exitwhen GetHandleGroup(t,"light")==null
call TriggerSleepAction(0.10)
endloop
call DestroyEffect(e)
set e = null
set t = null
set g = null
endfunction
function WovenTouchStart takes nothing returns nothing
//This function simply starts the spell
local group g = CreateGroup()
local unit targ = GetTriggerUnit()
local player p = GetOwningPlayer(targ)
local integer i = 1
local timer t = CreateTimer()
local unit u
local unit newtarg
local timer timeout = CreateTimer()
local real heal
if GetHandleHandle(GetTriggerUnit(), "light")==null then
loop
exitwhen i>WovenTouch_LightNumber()
set u = CreateUnit(p, WovenTouch_Light(), PolarProjectionX(GetUnitX(targ),WovenTouch_Dist(), 360/WovenTouch_LightNumber()*i), PolarProjectionY(GetUnitY(targ), 125.00, 360/WovenTouch_LightNumber()*i), 0.00)
call GroupAddUnit(g, u)
call SetHandleReal(u, "angle", bj_DEGTORAD*360/WovenTouch_LightNumber()*i)
set i = i+1
endloop
call SetHandleHandle(t, "rotation", targ)
call SetHandleHandle(targ, "light", g)
call SetHandleReal(g, "heal", WovenTouch_Heal()*GetUnitAbilityLevel(targ, WovenTouch_Code()))
call TimerStart(t, 0.035, true, function WovenTouch_Clock)
call TimerStart(timeout, 0.01, false, null)
loop
exitwhen GetHandleReal(g, "heal")<=0 or GetUnitState(targ, UNIT_STATE_LIFE)<=0 or TimerGetRemaining(timeout)<=0.00
call WovenTouchTarget(targ) //And so it begins
call TimerStart(timeout, WovenTouch_Duration(), false, null)
set newtarg = null//or else it won't enter the loop
set heal = GetHandleReal(g,"heal")
loop
exitwhen TimerGetRemaining(timeout)<=0.00 or newtarg!=null or GetUnitState(targ, UNIT_STATE_LIFE)<=0.00 or heal<=0.00
set newtarg = WovenTouch_SeekTarget(targ)
if (newtarg!=null) then
call SetHandleHandle(newtarg, "light", g)
call SetHandleHandle(targ, "light",null)
set targ = newtarg
call SetHandleHandle(t, "rotation", targ)
elseif (GetUnitState(targ, UNIT_STATE_LIFE)<GetUnitState(targ, UNIT_STATE_MAX_LIFE)) then
set newtarg=targ
else
call TriggerSleepAction(0.50)
endif
endloop
endloop
call SetHandleReal(g, "heal", null)
call SetHandleHandle(targ, "light", null)
call FlushHandleLocals(t)
endif
call PauseTimer(t)
call DestroyTimer(t)
call PauseTimer(timeout)
call DestroyTimer(timeout)
call ForGroup(g, function WovenTouch_DestroyLights)
call DestroyGroup(g)
set t = null
set newtarg = null
set u = null
set targ = null
set g = null
set p = null
endfunction
function WovenTouchStopMana takes nothing returns nothing
local unit cast = GetHandleUnit(GetExpiredTimer(), "woven")
call SetUnitState(cast, UNIT_STATE_MANA, GetUnitState(cast, UNIT_STATE_MANA)+WovenTouch_ManaCost())
call FlushHandleLocals(GetExpiredTimer())
call DestroyTimer(GetExpiredTimer())
set cast = null
endfunction
function WovenTouchStop takes nothing returns nothing
local unit cast = GetTriggerUnit()
local timer t = CreateTimer()
call IssueImmediateOrder( cast, "stop" )
call DisplayTextToPlayer(GetOwningPlayer(cast), 0.00, 0.00, "|cffffcc00Unit is already under the effect of the shield|r")
call SetHandleHandle(t, "woven", cast)
call TimerStart(t, 0.01, false, function WovenTouchStopMana)
set t = null
set cast = null
endfunction
//===========================================================================
function InitTrig_Woven_Touch takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_CAST)
call TriggerAddCondition(t, Condition(function WovenTouchCondStop))
call TriggerAddAction(t, function WovenTouchStop)
set gg_trg_Woven_Touch = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ(gg_trg_Woven_Touch, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_Woven_Touch, Condition(function WovenTouchCond))
call TriggerAddAction( gg_trg_Woven_Touch, function WovenTouchStart )
endfunction