library CodeVar // Useful stuff written by Jesus4Lyf.
function Stabiliser takes nothing returns nothing
endfunction
globals
string array TOCHAR
integer array bytecode
endglobals
function InitTOCHAR takes nothing returns nothing
set TOCHAR[0]="0"
set TOCHAR[1]="1"
set TOCHAR[2]="2"
set TOCHAR[3]="3"
set TOCHAR[4]="4"
set TOCHAR[5]="5"
set TOCHAR[6]="6"
set TOCHAR[7]="7"
set TOCHAR[8]="8"
set TOCHAR[9]="9"
set TOCHAR[10]="A"
set TOCHAR[11]="B"
set TOCHAR[12]="C"
set TOCHAR[13]="D"
set TOCHAR[14]="E"
set TOCHAR[15]="F"
endfunction
function ToHex takes integer i returns string
local integer r
local string result=""
call InitTOCHAR()
loop
exitwhen i==0
set r=i-(i/16)*16
set result=TOCHAR[r]+result
set i=(i-r)/16
endloop
return "0x"+result
endfunction
struct CodeVar // Written by Jesus4Lyf
private static constant trigger Trig=CreateTrigger()
static method create takes code f returns CodeVar
return f
return 0
endmethod
method operator code takes nothing returns code
return this
return null
endmethod
method operator code= takes code f returns CodeVar // Crashes if changed to int
return .create(f)
endmethod
private static method execCode takes code f returns nothing
call TriggerClearActions(.Trig)
call TriggerAddAction(.Trig,f)
call TriggerExecute(.Trig)
endmethod
private static method evalCode takes code f returns boolean
call TriggerClearConditions(.Trig)
call TriggerAddCondition(.Trig,Condition(f))
return TriggerEvaluate(.Trig)
endmethod
method exec takes nothing returns nothing
call .execCode(.code)
endmethod
method eval takes nothing returns boolean
return .evalCode(.code)
endmethod
endstruct
endlibrary
library Bytecode uses CodeVar // Prototype design written by Jesus4Lyf.
globals
private constant integer ZERO=1024
integer POINTERTOZERO//=0x0FBE1EE0 // Memory location for bj_meleeTwinkedHeroes[ZERO].
private constant integer HEXPAIRSPERINDEX=4
endglobals
// Complete abstraction.
private function GetPointerToIndex takes integer i returns integer
return POINTERTOZERO+(i-ZERO)*HEXPAIRSPERINDEX // HEX pairs per array index.
endfunction
private function WriteToIndex takes integer i, integer data returns nothing
set bj_meleeTwinkedHeroes<i>=data
endfunction
function TestPointer takes nothing returns nothing
call WriteToIndex(ZERO,0x0C00F5F7)
call WriteToIndex(ZERO+1,0x11111111)
call BJDebugMsg(ToHex(CodeVar.create(function GetRandomDirectionDeg)))
endfunction
function SetPointer takes nothing returns nothing
set POINTERTOZERO=CodeVar.create(function GetRandomDirectionDeg)+0xC92D8
endfunction
// Complete abstraction.
globals
private constant integer BYTECODESIZE=512
private integer LASTBYTECODE=0
// Bytecodes
private constant integer ENDFUNCTION=0x27000000
endglobals
struct Bytecode
integer lastwrite
private method seal takes nothing returns nothing
call WriteToIndex(this.lastwrite+1,ENDFUNCTION)
endmethod
private method append takes integer line returns nothing
set this.lastwrite=this.lastwrite+1
call WriteToIndex(this.lastwrite,line)
endmethod
static method create takes nothing returns Bytecode
// Increment global indexer.
local Bytecode this=LASTBYTECODE+BYTECODESIZE
set LASTBYTECODE=this
// Initialise.
set this.lastwrite=this-1
call this.seal()
// Return.
return this
endmethod
method getCodeVar takes nothing returns CodeVar
return GetPointerToIndex(this)
endmethod
method addCall takes integer funcID, integer param returns nothing
// Set 1.
call this.append(0x0C000000)
call this.append(param)
call this.append(0x13000000)
call this.append(0x00000000)
// Set 2.
call this.append(0x16000000)
call this.append(funcID)
call this.append(0x0B010000)
call this.append(0x00000000)
// End function.
call this.seal()
endmethod
endstruct
endlibrary</i>
// Jesus4Lyf's EpicTest. <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class="smilie smilie--sprite smilie--sprite1" alt=":)" title="Smile :)" loading="lazy" data-shortname=":)" />
globals
constant integer ZERO=1024
constant integer BYTECODE=0x0FBE1EE0 // Memory location.
endglobals
function SomeFunc takes integer i returns nothing
call BJDebugMsg("SomeFunc:")
call BJDebugMsg(I2S(i))
endfunction
function SomeOtherFunc takes integer i returns nothing
call BJDebugMsg("SomeOtherFunc:")
call BJDebugMsg("Other: "+I2S(i))
endfunction
function TimerGogo takes timer t, code f returns nothing
call BJDebugMsg("Starting dynamic timer...") // Don't inline! <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" class="smilie smilie--sprite smilie--sprite2" alt=";)" title="Wink ;)" loading="lazy" data-shortname=";)" />
call TimerStart(t,1.0,true,f)
endfunction
function TestFunc takes nothing returns nothing
call SomeFunc(15)
call SomeOtherFunc(15)
endfunction
function NoFunc takes nothing returns nothing
endfunction
function SID takes string s returns integer
return s
return 0
endfunction
function EpicTest takes nothing returns nothing
local Bytecode d
call SetPointer()
set d=Bytecode.create()
call TimerGogo(CreateTimer(),d.getCodeVar().code)
call BJDebugMsg("Adding call SomeFunc(1)")
call d.addCall(0x00000EE0,1)
call TriggerSleepAction(2.5)
call BJDebugMsg("Adding call SomeFunc(1337)")
call d.addCall(0x00000EE0,1337)
call TriggerSleepAction(2.0)
call BJDebugMsg("Adding call SomeOtherFunc(577)")
call d.addCall(0x00000EE2,577)
endfunction
//===========================================================================
function InitTrig_Melee_Initialization takes nothing returns nothing
set gg_trg_Melee_Initialization = CreateTrigger( )
call TriggerRegisterTimerEventSingle( gg_trg_Melee_Initialization, 0.50 )
call TriggerAddAction( gg_trg_Melee_Initialization, function EpicTest )
endfunction