1-
21ModUtil .Mod .Register ( " Hades" , ModUtil )
32
43ModUtil .Table .Merge ( ModUtil .Hades , {
@@ -391,19 +390,79 @@ function ModUtil.Hades.CloseMenuYesNo( screen, button )
391390 ModUtil .Hades .CloseMenu ( screen , button )
392391end
393392
394- -- Misc
393+ -- Trigger Proxy
394+
395+ local triggers = { }
396+
397+ local function isTrigger ( name )
398+ if name :sub ( 1 , 2 ) ~= " On" then return false end
399+ local func = _G [ name ]
400+ return type ( func ) == " function" and debug.getinfo ( func , " S" ).what == " C"
401+ end
402+
403+ local proxyTriggerMeta = {
404+ __index = function ( s , k )
405+ if type ( k ) == " string" then
406+ local w , n = pcall ( tonumber , k )
407+ if w then k = n end
408+ end
409+ return rawget ( s , k )
410+ end ,
411+ __newindex = function ( s , k , v )
412+ if type ( k ) == " string" then
413+ local w , n = pcall ( tonumber , k )
414+ if w then k = n end
415+ end
416+ rawset ( s , k , v )
417+ end
418+ }
395419
396- function ModUtil .Hades .RandomElement ( tableArg , rng )
397- local Collapsed = CollapseTable ( tableArg )
398- return Collapsed [ RandomInt ( 1 , # Collapsed , rng ) ]
420+ local function proxyTriggerCallback ( indexArray , func , args )
421+ local t = ModUtil .IndexArray .Get ( triggers , indexArray ) or setmetatable ( { }, proxyTriggerMeta )
422+ local n = # t + 1
423+ local f = ModUtil .Override ( func , function ( ... )
424+ return t [ n ].Call ( ... )
425+ end )
426+ table.insert ( t , { Args = args , Call = func } )
427+ ModUtil .IndexArray .Set ( triggers , indexArray , t )
428+ return f
429+ end
430+
431+ local function proxyTrigger ( name )
432+ ModUtil .IndexArray .Wrap ( _G , { name }, function ( base , args , ... )
433+ local cargs = ModUtil .Table .Copy ( args )
434+ local func = table.remove ( cargs )
435+ local file = debug.getinfo ( 2 , " S" ).source
436+ args [ # args ] = proxyTriggerCallback ( { name , file }, func , cargs )
437+ return base ( args , ... )
438+ end )
439+ end
440+
441+ setmetatable ( triggers , {
442+ __newindex = function ( s , k , v )
443+ if v == true then
444+ proxyTrigger ( k )
445+ v = s [ k ] or { }
446+ end
447+ rawset ( s , k , v )
448+ end
449+ } )
450+ ModUtil .Hades .Triggers = triggers
451+ ModUtil .Identifiers .Inverse [ triggers ] = " ModUtil.Hades.Triggers"
452+
453+ for k in pairs ( _G ) do
454+ if isTrigger ( k ) then
455+ proxyTrigger ( k )
456+ end
399457end
400458
401459-- Internal Access
402460
403461do
404462 local ups = ModUtil .UpValues ( function ( )
405463 return menuScreens , closeFuncs , forceClosed , printStack ,
406- orderPrintStack , closePrintStack , printDisplay
464+ orderPrintStack , closePrintStack , printDisplay ,
465+ triggers , isTrigger , proxyTrigger , proxyTriggerMeta , proxyTriggerCallback
407466 end )
408467 ModUtil .Entangled .Union .Add ( ModUtil .Internal , ups )
409468end
0 commit comments