167 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| LOGO_RIGHT_OFFSET_RATIO = -0.13;
 | |
| LOGO_TOP_OFFSET_RATIO = -0.07;
 | |
| 
 | |
| MAX_PASSWORD_LENGTH = 16;
 | |
| 
 | |
| X_CENTER = Window.GetWidth() / 2;
 | |
| Y_CENTER = Window.GetHeight() / 2;
 | |
| 
 | |
| status = "normal";
 | |
| 
 | |
| Window.SetBackgroundTopColor(0, 0, 0);
 | |
| Window.SetBackgroundBottomColor(0, 0, 0);
 | |
| 
 | |
| /* Images */
 | |
| container.image = Image("kali-logo-container.png");
 | |
| logo.image = Image("kali-logo.png");
 | |
| outline.image = Image("outline.png");
 | |
| fade.image = Image("kali-logo-fade.png");
 | |
| passwordDot.image = Image("password-dot.png");
 | |
| 
 | |
| if (Window.GetHeight() < 800) {
 | |
|   container.image = Image("kali-logo-container_small.png");
 | |
|   logo.image = Image("kali-logo_small.png");
 | |
|   outline.image = Image("outline_small.png");
 | |
|   fade.image = Image("kali-logo-fade_small.png");
 | |
|   passwordDot.image = Image("password-dot_small.png");
 | |
| }
 | |
| 
 | |
| // Kali logo can't be aligned by its natural center but by the circle center
 | |
| // formed inside its body curve. This can be easily calculated by the offset
 | |
| // ratio defined before.
 | |
| logo.rightOffset = logo.image.GetWidth() * LOGO_RIGHT_OFFSET_RATIO;
 | |
| logo.topOffset = logo.image.GetHeight() * LOGO_TOP_OFFSET_RATIO;
 | |
| 
 | |
| fun centerKaliLogo (image, zIndex) {
 | |
|   sprite = Sprite(image);
 | |
|   sprite.SetX(X_CENTER - image.GetWidth() / 2 + logo.rightOffset);
 | |
|   sprite.SetY(Y_CENTER - image.GetHeight() / 2 + logo.topOffset);
 | |
|   sprite.SetZ(zIndex);
 | |
|   sprite.SetOpacity(0);
 | |
|   return sprite;
 | |
| }
 | |
| 
 | |
| /* Kali logo sprites */
 | |
| logo.sprite = centerKaliLogo(logo.image, 4);
 | |
| fade.sprite = centerKaliLogo(fade.image, 3);
 | |
| container.sprite = centerKaliLogo(container.image, 2);
 | |
| outline.sprite = centerKaliLogo(outline.image, 1);
 | |
| 
 | |
| fun showKaliLogo () {
 | |
|   logo.sprite.SetOpacity(1);
 | |
|   fade.sprite.SetOpacity(0.5);
 | |
| }
 | |
| 
 | |
| /* -------------------------------- Message -------------------------------- */
 | |
| fun displayMessageCallback (text) {
 | |
|   prompt.image = Image.Text(text, 1, 1, 1);
 | |
|   prompt.sprite = Sprite(prompt.image);
 | |
|   prompt.sprite.SetPosition(
 | |
|     X_CENTER - prompt.image.GetWidth() / 2,
 | |
|     container.sprite.GetY() + container.image.GetHeight() + 50,
 | |
|     10000
 | |
|   );
 | |
|   global.prompt = prompt;
 | |
| }
 | |
| 
 | |
| Plymouth.SetMessageFunction(displayMessageCallback);
 | |
| 
 | |
| /* ---------------------------- Password Dialog ---------------------------- */
 | |
| fun passwordDialogSetup () {
 | |
|   passwordField.image = Image("password-field.png");
 | |
|   passwordField.sprite = Sprite(passwordField.image);
 | |
|   passwordField.y = container.sprite.GetY() + container.image.GetHeight();
 | |
|   passwordField.x = X_CENTER - passwordField.image.GetWidth() / 2;
 | |
|   passwordField.z = 5;
 | |
|   passwordField.sprite.SetX(passwordField.x);
 | |
|   passwordField.sprite.SetY(passwordField.y);
 | |
|   passwordField.sprite.SetZ(passwordField.z);
 | |
|   global.passwordField = passwordField;
 | |
|   showKaliLogo();
 | |
| }
 | |
| 
 | |
| fun setPasswordDialogOpacity (opacity) {
 | |
|   passwordField.sprite.SetOpacity(opacity);
 | |
| 
 | |
|   for (i = 0; passwordField.bullets[i]; i++)
 | |
|     passwordField.bullets[i].sprite.SetOpacity(opacity);
 | |
| }
 | |
| 
 | |
| fun passwordDialogCallback (prompt, bullets) {
 | |
|   global.status = "password";
 | |
| 
 | |
|   if (!global.passwordField)
 | |
|     passwordDialogSetup();
 | |
|   else
 | |
|     setPasswordDialogOpacity(1);
 | |
| 
 | |
|   displayMessageCallback(prompt);
 | |
| 
 | |
|   bulletWidth = passwordDot.image.GetWidth();
 | |
| 
 | |
|   for (i = 0;
 | |
|       passwordField.bullets[i] || i < bullets && i < MAX_PASSWORD_LENGTH;
 | |
|       i++) {
 | |
|     if (!passwordField.bullets[i]) {
 | |
|       passwordField.bullets[i].sprite = Sprite(passwordDot.image);
 | |
|       passwordField.bullets[i].sprite.SetX(passwordField.x
 | |
|           + (i + 1) * bulletWidth);
 | |
|       passwordField.bullets[i].sprite.SetY(passwordField.y);
 | |
|       passwordField.bullets[i].sprite.SetZ(passwordField.z);
 | |
|     }
 | |
| 
 | |
|     if (i < bullets)
 | |
|       passwordField.bullets[i].sprite.SetOpacity(1);
 | |
|     else
 | |
|       passwordField.bullets[i].sprite.SetOpacity(0);
 | |
|   }
 | |
| }
 | |
| 
 | |
| Plymouth.SetDisplayPasswordFunction(passwordDialogCallback);
 | |
| 
 | |
| fun displayNormalLogoCallback () {
 | |
|   global.status = "normal";
 | |
|   if (global.passwordField)
 | |
|     setPasswordDialogOpacity(0);
 | |
|   prompt.SetOpacity(0);
 | |
|   showKaliLogo();
 | |
| }
 | |
| 
 | |
| Plymouth.SetDisplayNormalFunction(displayNormalLogoCallback);
 | |
| Plymouth.SetQuitFunction(displayNormalLogoCallback);
 | |
| 
 | |
| 
 | |
| if (Plymouth.GetMode() == "boot") {
 | |
|   outline.movementRange =
 | |
|       container.image.GetHeight() - outline.image.GetHeight();
 | |
|   outline.initialPosition = container.sprite.GetY() + outline.movementRange;
 | |
|   outline.sprite.SetY(outline.initialPosition);
 | |
| 
 | |
|   container.sprite.SetOpacity(1);
 | |
|   outline.sprite.SetOpacity(1);
 | |
| 
 | |
|   fun bootProgressCallback (duration, progress) {
 | |
|     if (global.status != "normal") return;
 | |
|     if (progress < 0.1)
 | |
|       logo.sprite.SetOpacity(progress / 0.1);
 | |
|     else if (progress < 0.9) {
 | |
|       relativeProgress = (progress - 0.1) / 0.8;
 | |
|       outline.sprite.SetY(outline.initialPosition
 | |
|           - outline.movementRange * relativeProgress);
 | |
|       if (progress > 0.8 && progress < 0.85) {
 | |
|         relativeProgress = (progress - 0.8) / 0.05;
 | |
|         fade.sprite.SetOpacity(relativeProgress);
 | |
|       } else if (progress > 0.85) {
 | |
|         relativeProgress = (progress - 0.85) / 0.05;
 | |
|         fade.sprite.SetOpacity(1 - relativeProgress);
 | |
|       }
 | |
|     } else {
 | |
|       opacity = (1 - progress) / 0.1;
 | |
|       logo.sprite.SetOpacity(opacity);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   Plymouth.SetBootProgressFunction(bootProgressCallback);
 | |
| }
 | |
| 
 | 
