Graal Forums

Graal Forums (https://forums.graalonline.com/forums/index.php)
-   Code Gallery (https://forums.graalonline.com/forums/forumdisplay.php?f=179)
-   -   GS2 Character Creation (https://forums.graalonline.com/forums/showthread.php?t=82880)

cbk1994 11-23-2008 08:39 AM

GS2 Character Creation
 
This script generates a GS2 script of a character, as opposed to the GS1 script produced by the level editor.

Copy and paste the code given as output into a level NPC, upload it to a server, and it will show the character as you set it.

Screenshots:

http://img56.imageshack.us/img56/208/changedirqm4.png

http://img56.imageshack.us/img56/9030/dropdownpn8.png

http://img224.imageshack.us/img224/6647/outputtt6.png


Say "/create char" to open the window. It should be quite simple to add a different way to open the window.


PHP Code:

//#CLIENTSIDE
function showInterface() {
  if (
CreateChar_Window != null) {
    
CreateChar_Window.destroy();
  }
  
  new 
GuiWindowCtrl("CreateChar_Window") {
    
profile "GuiBlueWindowProfile";
    
    
width 212;
    
height 356;
    
    
GraalControl.width - (width 2);
    
GraalControl.height - (height 2);
    
    
canClose visible true;
    
canMaximize canMinimize canResize false;
    
    
text "Character Creation";
    
    new 
GuiShowImgCtrl("CreateChar_Doll") {
      
ani "idle";
      
      
CreateChar_Window.width 25;
      
32;
      
      
hint "Click to change direction.";
    }
    
    
temp.fields = {
                    {
"bodyimg""Body"},
                    {
"headimg""Head"},
                    {
"shield""Shield"},
                    {
"attr[1]""Hat"},
                    {
"ani""Ani"}
                  };
    
    
temp.parts getParts();
    
    
temp.colors getColors();
    
    for (
temp.field fields) {
      new 
GuiTextCtrl("CreateChar_FieldLabel_" field[1]) {
        
profile "GuiBlueTextProfile";
        
        
13;
        
90 23 fields.index(@ field);
        
        
text field[1] @ ":";
      }
      new 
GuiTextEditCtrl("CreateChar_Field_" field[1]) {
        
profile "GuiBlueTextEditProfile";
        
        
width 150;
        
height 20;
        
        
50;
        
90 + (height 3) * fields.index(@ field);
        
        if (
field[0] == "attr[1]") {
          
text CreateChar_Doll.actor.attr[1];
        } else {
          
text CreateChar_Doll.actor.(@ field[0]);
        }
        
        if (
text == null) {
          
text "";
        }
        
        
thiso.catchevent(name"onAction""onTextChanges");
        
        
this.part field[0];
      }
    }
    for (
temp.part parts) {
      new 
GuiTextCtrl("CreateChar_PartLabel_" part) {
        
profile "GuiBlueTextProfile";
        
        
13;
        
206 23 parts.index(@ part);
        
        
text part ":";
      }
      new 
GuiPopUpMenuCtrl("CreateChar_Part_" part) {
        
profile "GuiBluePopUpMenuProfile";
        
scrollprofile "GuiBlueScrollProfile";
        
textprofile "GuiBlueTextListProfile";
        
        
width 150;
        
height 20;
        
        
50;
        
206 + (height 3) * parts.index(@ part);
        
        
clearRows();
        
        for (
temp.colors) {
          
addRow(0c);
        }
        
        
setSelectedRow(CreateChar_Doll.actor.colors[parts.index(@ part)]);
        
        
thiso.catchevent(name"onSelect""onColorSelected");
        
        
this.part;
      }
    }
    
    new 
GuiButtonCtrl("CreateChar_Generate") {
      
profile "GuiBlueButtonProfile";
      
      
width 60;
      
height 22;
      
      
CreateChar_Window.width - (width 2);
      
323;
      
      
text "Generate";
    }    
  }
}
function 
CreateChar_Generate.onAction() {
  
temp.char CreateChar_Doll;
  
// {dir, body, head, shield, hat, ani, colors}
  
temp.generateFrom = {char.actor.dirchar.actor.bodyimgchar.actor.headimgchar.actor.shieldchar.actor.attr[1], char.anichar.actor.colors};
  
  
generateCode(generateFrom);
  
  
CreateChar_Window.destroy();
}
function 
CreateChar_Doll.onMouseDown() {
  
CreateChar_Doll.actor.dir ++;
}
function 
onTextChanges(controlnewtext) {
  
temp.part control.part;
  
  if (
part == "attr[1]") {
    
CreateChar_Doll.actor.attr[1] = newtext;
    return;
  }
  if (
part == "ani") {
    
CreateChar_Doll.ani newtext;
  }
  
  
CreateChar_Doll.actor.(@ part) = newtext;
}
function 
onColorSelected(control) {
  
temp.colors getColors();
  
temp.parts getParts();
  
  
temp.part parts.index(@ (@control).p);
  
temp.colors.index(@ (@ control).getSelectedText());
  
  
CreateChar_Doll.actor.colors[part] = c;
}
function 
getParts() {
  return {
           
"Skin",
           
"Coat",
           
"Sleeves",
           
"Shoes",
           
"Belt"
         
};
}
function 
getColors() {
  return {
           
"White",
           
"Yellow",
           
"Orange",
           
"Pink",
           
"Red",
           
"Dark Red",
           
"Light Green",
           
"Green",
           
"Dark Green",
           
"Light Blue",
           
"Blue",
           
"Dark Blue",
           
"Brown",
           
"Cynober",
           
"Purple",
           
"Dark Purple",
           
"Light Gray",
           
"Gray",
           
"Black",
           
"Transparent"
         
};
}
function 
generateCode(from) {
  
// {dir, body, head, shield, hat, ani, colors}
  
  
temp.lines = {"/" "/ Made by" SPC player.nick"/" "/#CLIENTSIDE""function onCreated() {""  showcharacter();"};
  
  
temp.vars = {
                
"bodyimg",
                
"headimg",
                
"shield",
                
"hat",
                
"ani"
              
};
  
  
lines.add("  this.dir = " from[0] @ ";");
  
  
temp.inc 1;
  
  for (
temp.vars) {
    if (
from[inc] != null) {
      
lines.add("  this." v SPC "= \"" from[inc] @ "\";");
    }
    
inc ++;
  }
  
  for (
temp.05++) {
    
lines.add("  this.colors[" "] =" SPC from[6][c] @ ";");
  }
  
  
lines.add("}");
  
lines.add("function onPlayerEnters() {");
  
lines.add("  onCreated();");
  
lines.add("}");
  
  if (
CreateCharOutput_Window != null) {
    
CreateCharOutput_Window.destroy();
  }
  new 
GuiWindowCtrl("CreateCharOutput_Window") {
    
profile "GuiBlueWindowProfile";
    
    
width 212;
    
height 356;
    
    
GraalControl.width - (width 2);
    
GraalControl.height - (height 2);
    
    
canClose visible true;
    
canMinimize canMaximize canResize false;
    
    
text "Create Character: Output";
    
    new 
GuiScrollCtrl("CreateCharOutput_Scroll") {
      
profile "GuiBlueScrollProfile";
      
      
10;
      
28;
      
      
width 192;
      
height 319;
      
      
vScrollBar "alwaysOn";
      
hScrollBar "alwaysOff";
      
      new 
GuiMLTextCtrl("CreateCharOutput_Text") {
        
profile "GuiBlueTextProfile";
        
        
width 202;
        
        
0;
        
1;
        
        
text null;
        
        for (
temp.line lines) {
          if (
text == null) {
            
text line;
          } else {
            
text @= "\n" line;
          }
        }
      }
    }
  }
}
function 
onPlayerChats() {
  if (
player.chat "/create char") {
    
showInterface();
  }



DustyPorViva 11-23-2008 08:42 AM

Nice stuff, though I would prefer 16x16 blocks of colors in rows and columns to minimize the size of the drop menu... I hate selecting colors like that.

Umat 11-23-2008 08:48 AM

nice! :)

Crow 11-23-2008 10:46 AM

Nice, this can be very useful :)

xXziroXx 11-23-2008 12:22 PM

Use setCharAni("ANI"); :frown:

DustyPorViva 11-23-2008 12:26 PM

setCharani("ani",null); :P

cbk1994 11-23-2008 06:48 PM

Quote:

Originally Posted by xXziroXx (Post 1444245)
Use setCharAni("ANI"); :frown:

Why?

xXziroXx 11-23-2008 11:05 PM

Quote:

Originally Posted by cbk1994 (Post 1444328)
Why?

Because it's the preferred way. :oo:

cbk1994 11-23-2008 11:47 PM

Quote:

Originally Posted by xXziroXx (Post 1444385)
Because it's the preferred way. :oo:

Why? It works both ways.

ApothiX 12-02-2008 06:58 AM

Quote:

Originally Posted by cbk1994 (Post 1444400)
Why? It works both ways.

GScript1 still works, why use GScript2?

cbk1994 12-02-2008 11:47 PM

Quote:

Originally Posted by ApothiX (Post 1446205)
GScript1 still works, why use GScript2?

I guess you were with the idea of using setCharAni?

this.ani seems to me to be a much better way to set it; setCharAni was probably kept mostly for compatibility, though I could be wrong. As far as I know, 'this.ani', using commas for parameters, can duplicate the functionality.

I don't see why you claim it's the preferred way. Seems more of an opinion thing to me; if it wasn't intended to be used, it would not have been added. It didn't exist in GS1, remember.

Crono 12-02-2008 11:55 PM

Quote:

Originally Posted by cbk1994 (Post 1446337)
Seems more of an opinion thing to me

oh...really?

xXziroXx 12-03-2008 12:27 AM

Quote:

Originally Posted by cbk1994 (Post 1446337)
I guess you were with the idea of using setCharAni?

this.ani seems to me to be a much better way to set it; setCharAni was probably kept mostly for compatibility, though I could be wrong. As far as I know, 'this.ani', using commas for parameters, can duplicate the functionality.

I don't see why you claim it's the preferred way. Seems more of an opinion thing to me; if it wasn't intended to be used, it would not have been added. It didn't exist in GS1, remember.

The function is supposed to be used to set it, and the string supposed to be used to read the players ani. While it does work setting it that way, it's not the preferred way. What do I base that one? Simple, that you can send params to the gani, hinting that a function is the preferred way.

cbk1994 12-03-2008 03:24 AM

Quote:

Originally Posted by xXziroXx (Post 1446348)
The function is supposed to be used to set it, and the string supposed to be used to read the players ani. While it does work setting it that way, it's not the preferred way. What do I base that one? Simple, that you can send params to the gani, hinting that a function is the preferred way.

You can take it either way, I guess. Feel free to modify my code if it annoys you that much.

However, I will continue to use 'this.ani', as it, in my opinion, fits better with the style of everything else.

By the way, there are also functions for setting head, etc. I guess I should be using setcharprop instead of this.headimg, right?

Tolnaftate2004 12-03-2008 07:49 AM

Quote:

Originally Posted by xXziroXx (Post 1446348)
words

It is less costly to set the string.


All times are GMT +2. The time now is 10:18 PM.

Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2025, vBulletin Solutions Inc.
Copyright (C) 1998-2019 Toonslab All Rights Reserved.