#include maps\_utility; #include animscripts\utility; #include common_scripts\utility; setParent( element ) { if ( isDefined( self.parent ) && self.parent == element ) return; if ( isDefined( self.parent ) ) self.parent removeChild( self ); self.parent = element; self.parent addChild( self ); if ( isDefined( self.point ) ) self setPoint( self.point, self.relativePoint, self.xOffset, self.yOffset ); else self setPoint( "TOPLEFT" ); } getParent() { return self.parent; } addChild( element ) { element.index = self.children.size; self.children[self.children.size] = element; } removeChild( element ) { element.parent = undefined; if ( self.children[self.children.size-1] != element ) { self.children[element.index] = self.children[self.children.size-1]; self.children[element.index].index = element.index; } self.children[self.children.size-1] = undefined; element.index = undefined; } setPoint( point, relativePoint, xOffset, yOffset, moveTime ) { if ( !isDefined( moveTime ) ) moveTime = 0; element = self getParent(); if ( moveTime ) self moveOverTime( moveTime ); if ( !isDefined( xOffset ) ) xOffset = 0; self.xOffset = xOffset; if ( !isDefined( yOffset ) ) yOffset = 0; self.yOffset = yOffset; self.point = point; self.alignX = "center"; self.alignY = "middle"; if ( isSubStr( point, "TOP" ) ) self.alignY = "top"; if ( isSubStr( point, "BOTTOM" ) ) self.alignY = "bottom"; if ( isSubStr( point, "LEFT" ) ) self.alignX = "left"; if ( isSubStr( point, "RIGHT" ) ) self.alignX = "right"; if ( !isDefined( relativePoint ) ) relativePoint = point; self.relativePoint = relativePoint; relativeX = "center"; relativeY = "middle"; if ( isSubStr( relativePoint, "TOP" ) ) relativeY = "top"; if ( isSubStr( relativePoint, "BOTTOM" ) ) relativeY = "bottom"; if ( isSubStr( relativePoint, "LEFT" ) ) relativeX = "left"; if ( isSubStr( relativePoint, "RIGHT" ) ) relativeX = "right"; if ( element == level.uiParent ) { self.horzAlign = relativeX; self.vertAlign = relativeY; } else { self.horzAlign = element.horzAlign; self.vertAlign = element.vertAlign; } if ( relativeX == element.alignX ) { offsetX = 0; xFactor = 0; } else if ( relativeX == "center" || element.alignX == "center" ) { offsetX = int(element.width / 2); if ( relativeX == "left" || element.alignX == "right" ) xFactor = -1; else xFactor = 1; } else { offsetX = element.width; if ( relativeX == "left" ) xFactor = -1; else xFactor = 1; } self.x = element.x + (offsetX * xFactor); if ( relativeY == element.alignY ) { offsetY = 0; yFactor = 0; } else if ( relativeY == "middle" || element.alignY == "middle" ) { offsetY = int(element.height / 2); if ( relativeY == "top" || element.alignY == "bottom" ) yFactor = -1; else yFactor = 1; } else { offsetY = element.height; if ( relativeY == "top" ) yFactor = -1; else yFactor = 1; } self.y = element.y + (offsetY * yFactor); self.x += self.xOffset; self.y += self.yOffset; switch ( self.elemType ) { case "bar": setPointBar( point, relativePoint, xOffset, yOffset ); break; } self updateChildren(); } setPointBar( point, relativePoint, xOffset, yOffset ) { self.bar.horzAlign = self.horzAlign; self.bar.vertAlign = self.vertAlign; self.bar.alignX = "left"; self.bar.alignY = self.alignY; self.bar.y = self.y; if ( self.alignX == "left" ) self.bar.x = self.x; else if ( self.alignX == "right" ) self.bar.x = self.x - self.width; else self.bar.x = self.x - int(self.width / 2); if ( self.alignY == "top" ) self.bar.y = self.y; else if ( self.alignY == "bottom" ) self.bar.y = self.y; self updateBar( self.bar.frac ); } updateBar( barFrac, rateOfChange ) { if ( self.elemType == "bar" ) updateBarScale( barFrac, rateOfChange ); } updateBarScale( barFrac, rateOfChange ) { barWidth = int(self.width * barFrac + 0.5); if ( !barWidth ) barWidth = 1; self.bar.frac = barFrac; self.bar setShader( self.bar.shader, barWidth, self.height ); assertEx( barWidth <= self.width, "barWidth <= self.width: " + barWidth + " <= " + self.width + " - barFrac was " + barFrac ); if ( isDefined( rateOfChange ) && barWidth < self.width ) { if ( rateOfChange > 0 ) { assertex( ((1 - barFrac) / rateOfChange) > 0, "barFrac: " + barFrac + "rateOfChange: " + rateOfChange ); self.bar scaleOverTime( (1 - barFrac) / rateOfChange, self.width, self.height ); } else if ( rateOfChange < 0 ) { assertex( (barFrac / (-1 * rateOfChange)) > 0, "barFrac: " + barFrac + "rateOfChange: " + rateOfChange ); self.bar scaleOverTime( barFrac / (-1 * rateOfChange), 1, self.height ); } } self.bar.rateOfChange = rateOfChange; self.bar.lastUpdateTime = getTime(); } createFontString( font, fontScale, player ) { if(isdefined(player)) { fontElem = newClientHudElem(player); } else { fontElem = newHudElem( self ); } fontElem.elemType = "font"; fontElem.font = font; fontElem.fontscale = fontScale; fontElem.x = 0; fontElem.y = 0; fontElem.sort = 100; fontElem.width = 0; fontElem.height = int(level.fontHeight * fontScale); fontElem.xOffset = 0; fontElem.yOffset = 0; fontElem.children = []; fontElem setParent( level.uiParent ); fontElem.hidden = false; return fontElem; } createServerFontString( font, fontScale ) { fontElem = newHudElem( self ); fontElem.elemType = "font"; fontElem.font = font; fontElem.fontscale = fontScale; fontElem.x = 0; fontElem.y = 0; fontElem.width = 0; fontElem.height = int(level.fontHeight * fontScale); fontElem.xOffset = 0; fontElem.yOffset = 0; fontElem.children = []; fontElem setParent( level.uiParent ); return fontElem; } createServerTimer( font, fontScale ) { timerElem = newHudElem(); timerElem.elemType = "timer"; timerElem.font = font; timerElem.fontscale = fontScale; timerElem.x = 0; timerElem.y = 0; timerElem.width = 0; timerElem.height = int(level.fontHeight * fontScale); timerElem.xOffset = 0; timerElem.yOffset = 0; timerElem.children = []; timerElem setParent( level.uiParent ); return timerElem; } createIcon( shader, width, height, player ) { if(isdefined(player)) { iconElem = newClientHudElem( player ); } else { iconElem = newHudElem( self ); } iconElem.elemType = "icon"; iconElem.x = 0; iconElem.y = 0; iconElem.width = width; iconElem.height = height; iconElem.xOffset = 0; iconElem.yOffset = 0; iconElem.children = []; iconElem setParent( level.uiParent ); if ( isDefined( shader ) ) iconElem setShader( shader, width, height ); return iconElem; } createBar( color, width, height, flashFrac ) { barElem = newClientHudElem( self ); barElem.x = 0 ; barElem.y = 0; barElem.frac = 0; barElem.color = color; barElem.sort = -2; barElem.shader = "white"; barElem setShader( "white", width, height ); barElem.hidden = false; if ( isDefined( flashFrac ) ) { barElem.flashFrac = flashFrac; } barElemFrame = newClientHudElem( self ); barElemFrame.elemType = "icon"; barElemFrame.x = 0; barElemFrame.y = 0; barElemFrame.width = width; barElemFrame.height = height; barElemFrame.xOffset = 0; barElemFrame.yOffset = 0; barElemFrame.bar = barElem; barElemFrame.barFrame = barElemFrame; barElemFrame.children = []; barElemFrame.sort = -1; barElemFrame.color = (1,1,1); barElemFrame setParent( level.uiParent ); barElemFrame.hidden = false; barElemBG = newClientHudElem( self ); barElemBG.elemType = "bar"; if ( !level.splitScreen ) { barElemBG.x = -2; barElemBG.y = -2; } barElemBG.width = width; barElemBG.height = height; barElemBG.xOffset = 0; barElemBG.yOffset = 0; barElemBG.bar = barElem; barElemBG.barFrame = barElemFrame; barElemBG.children = []; barElemBG.sort = -3; barElemBG.color = (0,0,0); barElemBG.alpha = 0.5; barElemBG setParent( level.uiParent ); if ( !level.splitScreen ) barElemBG setShader( "black", width + 4, height + 4 ); else barElemBG setShader( "black", width + 0, height + 0 ); barElemBG.hidden = false; return barElemBG; } createPrimaryProgressBar() { bar = createBar( (1, 1, 1), level.primaryProgressBarWidth, level.primaryProgressBarHeight ); if ( level.splitScreen ) bar setPoint("TOP", undefined, level.primaryProgressBarX, level.primaryProgressBarY); else bar setPoint("CENTER", undefined, level.primaryProgressBarX, level.primaryProgressBarY); return bar; } createPrimaryProgressBarText() { text = createFontString( "objective", level.primaryProgressBarFontSize, self ); if ( level.splitScreen ) text setPoint("TOP", undefined, level.primaryProgressBarTextX, level.primaryProgressBarTextY); else text setPoint("CENTER", undefined, level.primaryProgressBarTextX, level.primaryProgressBarTextY); text.sort = -1; return text; } hideElem() { if ( self.hidden ) return; self.hidden = true; if ( self.alpha != 0 ) self.alpha = 0; if ( self.elemType == "bar" || self.elemType == "bar_shader" ) { self.bar.hidden = true; if ( self.bar.alpha != 0 ) self.bar.alpha = 0; self.barFrame.hidden = true; if ( self.barFrame.alpha != 0 ) self.barFrame.alpha = 0; } } showElem() { if ( !self.hidden ) return; self.hidden = false; if ( self.elemType == "bar" || self.elemType == "bar_shader" ) { if ( self.alpha != .5 ) self.alpha = .5; self.bar.hidden = false; if ( self.bar.alpha != 1 ) self.bar.alpha = 1; self.barFrame.hidden = false; if ( self.barFrame.alpha != 1 ) self.barFrame.alpha = 1; } else { if ( self.alpha != 1 ) self.alpha = 1; } } flashThread() { self endon ( "death" ); self.alpha = 1; while(1) { if ( self.frac >= self.flashFrac ) { self fadeOverTime(0.3); self.alpha = .2; wait(0.35); self fadeOverTime(0.3); self.alpha = 1; wait(0.7); } else { self.alpha = 1; wait ( 0.05 ); } } } destroyElem() { tempChildren = []; for ( index = 0; index < self.children.size; index++ ) tempChildren[index] = self.children[index]; for ( index = 0; index < tempChildren.size; index++ ) tempChildren[index] setParent( self getParent() ); if ( self.elemType == "bar" ) { self.bar destroy(); self.barFrame destroy(); } self destroy(); } setIconShader( shader ) { self setShader( shader, self.width, self.height ); } updateChildren() { for ( index = 0; index < self.children.size; index++ ) { child = self.children[index]; child setPoint( child.point, child.relativePoint, child.xOffset, child.yOffset ); } } get_countdown_hud( x ) { xPos = undefined; if ( !isdefined( x ) ) xPos = -225; else xPos = x; hudelem = newHudElem(); hudelem.alignX = "left"; hudelem.alignY = "middle"; hudelem.horzAlign = "right"; hudelem.vertAlign = "top"; hudelem.x = xPos; hudelem.y = 100; if ( arcadeMode() ) { hudelem.alignX = "left"; hudelem.alignY = "top"; hudelem.horzAlign = "right"; hudelem.vertAlign = "top"; hudelem.y = 0; } hudelem.fontScale = 1.6; hudelem.color = (0.8, 1.0, 0.8); hudelem.font = "objective"; hudelem.glowColor = (0.3, 0.6, 0.3); hudelem.glowAlpha = 1; hudelem.foreground = 1; hudelem.hidewheninmenu = true; return hudelem; }