117 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| -- ======================================================================
 | |
| --[[    RF accessibility widget
 | |
| 
 | |
|     Author: Catspaw
 | |
|     Credits: based on code by RavenAscendant
 | |
| 
 | |
| -- ======================================================================
 | |
|     This file is required for the RF receiver accessibility widget 
 | |
|     included with NERFS.
 | |
| 
 | |
|     It takes no action of its own unless called, and will not conflict
 | |
|     with anything whatsoever--but if you don't need it, you can safely
 | |
|     delete this file without any ill effects to NERFS.
 | |
| -- ===================================================================--]]
 | |
| 
 | |
| class "UIRFWidget" (CUIScriptWnd)
 | |
| 
 | |
| function UIRFWidget:__init(xmlfile,element,texture,pos) super()
 | |
|     self:InitControls(xmlfile,element,texture,pos)
 | |
|     RegisterScriptCallback("actor_on_net_destroy", self)
 | |
| end
 | |
| 
 | |
| 
 | |
| function UIRFWidget:__finalize()
 | |
| end
 | |
| 
 | |
| 
 | |
| function UIRFWidget:InitControls(xmlfile,element,texture,pos)
 | |
|     self.colors = {
 | |
|         em          = {r = 200, g = 0,   b = 0,  a = 128},
 | |
|         lo          = {r = 50,  g = 50,  b = 50, a = 255},
 | |
|         hi          = {r = 50,  g = 250, b = 50, a = 255},
 | |
|     }
 | |
|     local clr = self.colors
 | |
|     self.signal_pulse_fade  = 10
 | |
|     self.int_alpha_loss_max = 0.5
 | |
|     self.pos = pos or {x=491,y=670}
 | |
|     self:SetAutoDelete(true)
 | |
|     self.xml        = CScriptXmlInit()
 | |
|     self.xml:ParseFile(xmlfile or "rax_rf_indicator.xml")
 | |
|     self.indicator  = self.xml:InitStatic(element or "indicator",self)
 | |
|     if texture then self.indicator:InitTexture(texture) end
 | |
|     self.indicator:SetTextureColor(GetARGB(clr.lo.a, clr.lo.r, clr.lo.g, clr.lo.b))
 | |
|     self.indicator:SetWndPos(vector2():set(self.pos.x, self.pos.y))
 | |
|     self.indicator:EnableHeading(true)
 | |
|     self:ShowIndicator(false)
 | |
| end
 | |
| 
 | |
| 
 | |
| function UIRFWidget:SetSignalColor(sigstr,colors)
 | |
|     if colors and self.colors[sigstr] then
 | |
|         self.colors[sigstr] = colors
 | |
|     end
 | |
| end
 | |
| 
 | |
| 
 | |
| function UIRFWidget:Destroy()
 | |
|     get_hud():RemoveDialogToRender(self)
 | |
| end
 | |
| 
 | |
| 
 | |
| function UIRFWidget:actor_on_net_destroy()
 | |
|     get_hud():RemoveDialogToRender(self)
 | |
| end
 | |
| 
 | |
| 
 | |
| function UIRFWidget:ShowIndicator(onoff)
 | |
|     self.indicator:Show(onoff)
 | |
| end
 | |
| 
 | |
| 
 | |
| function UIRFWidget:SetPos(x,y)
 | |
|     self.pos.x = x or self.pos.x
 | |
|     self.pos.y = y or self.pos.y
 | |
|     self.indicator:SetWndPos(vector2():set(self.pos.x, self.pos.y))
 | |
| end
 | |
| 
 | |
| 
 | |
| function UIRFWidget:SetIndicatorColor(signal, interference,emission, tg)
 | |
|     local tg_emission_noise = math.random(100,400)
 | |
|     local emission_str      = 0
 | |
|     local colors            = self.colors
 | |
| 
 | |
|     local red   = colors.lo.r
 | |
|     local green = colors.lo.g
 | |
|     local blue  = colors.lo.b
 | |
|     local alpha = colors.lo.a
 | |
| 
 | |
|     red     = ((colors.lo.r  + (colors.hi.r - colors.lo.r) * signal) + red   * self.signal_pulse_fade) / (self.signal_pulse_fade + 1)
 | |
|     green   = ((colors.lo.g  + (colors.hi.g - colors.lo.g) * signal) + green * self.signal_pulse_fade) / (self.signal_pulse_fade + 1)
 | |
|     blue    = ((colors.lo.b  + (colors.hi.b - colors.lo.b) * signal) + blue  * self.signal_pulse_fade) / (self.signal_pulse_fade + 1)
 | |
|     alpha   = (((colors.lo.a + (colors.hi.a - colors.lo.a) * signal) - 255   * self.int_alpha_loss_max * interference) + alpha * self.signal_pulse_fade) / (self.signal_pulse_fade +1)
 | |
| 
 | |
|     local clr = GetARGB(alpha,red,green,blue)
 | |
|     if emission then
 | |
|         if tg > tg_emission_noise then
 | |
|             emission_str = clamp(emission_str+ math.random(-0.1,0.2),0,1) or 0
 | |
|             tg_emission_noise = math.random(100,400)
 | |
|         end
 | |
|         local r = clamp(red     + colors.em.r * emission_str, 0, 255)
 | |
|         local g = clamp(green   + colors.em.g * emission_str, 0, 255)
 | |
|         local b = clamp(blue    + colors.em.b * emission_str, 0, 255)
 | |
|         local a = clamp(alpha   + colors.em.a * emission_str, 0, 255)
 | |
|         clr = GetARGB(a,r,g,b)
 | |
|     else
 | |
|         emission_str = 0
 | |
|     end
 | |
|     
 | |
|     self.indicator:SetTextureColor(clr)
 | |
| end
 | |
| 
 | |
| 
 | |
| function UIRFWidget:Update()
 | |
|     if not db.actor then return end
 | |
|     CUIScriptWnd.Update(self)
 | |
| end
 |