// ,¦¦
// ¦ ¦¦¦¦
// ¦ ¦¦¦¦¦ 2010 still moving on...
// ¦ ¦¦ ¦¦¦¦¦¦
// ¦ ¦¦ ¦¦¦¦¦¦ ¦¦¦
// ¦ ¦¦ ¦¦¦ ¦¦
// ¦ ¦ ¦ ¦¦ ¦¦¦¦¦¦¦¦
// ¦ ¦¦¦_ ¦ ¦¦ ¦¦¦ ¯¦.
// ¦ ¦ ¦¦¦¦¦ ____ ¦¦¦¦ ¯¦
// ¦ ¦ ¦¦¦_ _¦¦¦¦______¦¦ __ ¦
// ¦ ¦ ¦ _¦¦¦¦¦¦¦¦¦¦¦¦¦ _¦¦, ¯¦
// ¦ , ¦_ ¦ ¦¦¦¦¦¦¦¦¦¦¦¦¦ _¦¦¯ ¯¦
// ¦ ¦ ¯ ¦¦ ¦¦¦¦¦¦¦¦¦¦¦¦¦ ¦¦¦¦_ ¦.
// ,¦ ¦ ¦ ¦¦¦¦¦¯¯¯¯¯¦¦¦ ¦¦¦¦¦ ¦
// ¦ ¦ ¦ ¯¦¦¦¦ ¯¦¦_ ¦¦¦¦¦ ¦
// ¦¦ ¦_ ¦ ¯¦. ¯¦¦ ¯¦¦¦¦ ¦
// ¦ ¦ ¦ ¦¦ ¯¯¯¯ ¦
// ¦¦ ¦ ¦_ _ ¦¦¦ ¦
// _¦ ¦ ¦ ¦ ¦¦¦¦ _¦
// #----------------------------------------------------------#
// |================!NgO is sappin' ma sentry!================|
// #----------------------------------------------------------#
//
// * NgO is fucking proud to present the release of the new iGen =) *
//
// ************************************************************************************************************************************
// * ~ Release ~ *
// * +++++++++++ *
// * *
// * Name: iGen x2.1a *
// * Type: Code Generater *
// * Language: vJass *
// * Made by: Hanky *
// * Date: 10-04-2010 *
// * *
// * Description: This system is there to make your life easier creating a MMORPG. *
// * This system is able to create save/load codes. Also this system *
// * is using an unique encryption method which is pretty secure. *
// * *
// * I can just say: Enjoy our release =) *
// * *
// ************************************************************************************************************************************
//
// ************************************************************************************************************************************
// * ~ Notes ~ *
// * +++++++++ *
// * *
// * If you want to contact me, *
// * then just contact me? *
// * *
// ************************************************************************************************************************************
// ************************************************************************************************************************************
// * ~ Greetings fly out to ~ *
// * ++++++++++++++++++++++++ *
// * *
// * Darkt3mpl3r, JonNny, WaRadius, xxdingoxx93, De.Facto, Toadcop, Paladon *
// * Eccho, -BerzeKer-, Fireeye, Bodo *
// * *
// * NgO & HIVE *
// * *
// ************************************************************************************************************************************
// ************************************************************************************************************************************
// * One of the last releases NgO will release for Warcraft 3. But we'll never die. *
// * So we will continue making mods for Starcraft 2. *
// * *
// * With this release I want advice you to take a look at our latest Project Chernobyl. *
// * It's a riddle map with much stuff you can explore. A playable version will be out *
// * soon. *
// * *
// ************************************************************************************************************************************
// *_____________________________________________________nfo_design_by_Hanky__________________________________________________________*
// ************************************************************************************************************************************
library iGen
globals
public constant boolean keyEncryption =false //Enable an extra keyEncryption (Important: The char library of every parameter will change to the key char library.)
public constant integer mparameterSize=20 //This is the maximal size of parameters you can enter. You can change it to your needs.
public constant integer delimiterInt =5 //If you use delimiters you can set the interval here.
public constant string delimiterSign ="-" //Remember that the delimiter sign should be never in a library. Otherwise it can't be recogenized correctly.
public constant string colorcodeNum ="|c000080FF" //For "0..1..2"
public constant string colorcodeabc ="|c00008000" //For "a..b..c"
public constant string colorcodeABC ="|c00FFFF00" //For "A..B..C"
public constant string colorcodeXtr ="|c00FF0000" //For everything else
public constant string signLibrary1 ="0123456789" //Set up the numeric characters
public constant string signLibrary2 ="abcdefghijklmnopqrstuvwxyz" //Set up the normal characters
public constant string signLibrary3 ="ABCDEFGHIJKLMNOPQRSTUVWXYZ" //Set up the capital characters
public constant string signLibrary4 ="@$[_!?&%:}~*+=<>)(/-" //Set up the extra signs/characters
endglobals
public struct parameterLibrary
//==================================================
//Vars
//> Sign Library Vars
string Library //< Encryption/Decryption Library
integer Size //< The Size Of The Library
integer maxHex //< The Size Of The Last HexCode
integer maxInt //< The Size Of The Last Integer
//*******************
//> Parameter Value Vars
string Encrypt //< Encrypted string
integer Decrypt //< Decrypted integer
integer Extent //< Extent integer
integer Length //< Length integer
integer CRC //< Checksum integer
boolean Active //< Active boolean
//*******************
//==================================================
//onStructEvent Methods
static method create takes nothing returns thistype
local thistype iCook=thistype.allocate()
set iCook.Library=null
set iCook.Size =0x00
set iCook.Encrypt=null
set iCook.Decrypt=0x00
set iCook.Extent =0x00
set iCook.Length =0x00
set iCook.CRC =0x00
set iCook.Active =false
return iCook
endmethod
//==================================================
//Convert Methods
//> Int2Char
// > Convert an integer value to a char
method Int2Char takes integer i returns string
if i>=0x00 and i<=.Size then
return SubString(.Library,i,i+0x01)
debug else
debug call BJDebugMsg("Error: Invalid parameter")
endif
return null
endmethod
//> Char2Int
// > Convert a char to an integer value
method Char2Int takes string s returns integer
local integer l=StringLength(s)
local integer i=0x00
if l==0x01 then
loop
exitwhen i==.Size
if SubString(.Library,i,i+0x01)==s then
return i
endif
set i=i+0x01
endloop
debug else
debug call BJDebugMsg("ERROR: Just enter one char")
endif
debug call BJDebugMsg("ERROR: Invalid parameter")
return -0x01
endmethod
//> Hex2Int
// > Convert the encrypt var to an integer value for the decrypt var
method Hex2Int takes nothing returns nothing
local integer l=StringLength(.Encrypt)
local integer m=0x01
local integer i=0x00
if maxHex>=l then
loop
exitwhen 0x00==l
set i=m*.Char2Int(SubString(.Encrypt,l-0x01,l))+i
set m=m*.Size
set l=l-0x01
endloop
debug else
debug call BJDebugMsg("ERROR: Invalid parameter")
endif
set .Decrypt=i
endmethod
//> Hex2IntEx
// > Convert the encrypt var to an integer value for the decrypt var
method Hex2IntEx takes string iEx returns integer
local integer l=StringLength(iEx)
local integer m=0x01
local integer i=0x00
if maxHex>=l then
loop
exitwhen 0x00==l
set i=m*.Char2Int(SubString(iEx,l-0x01,l))+i
set m=m*.Size
set l=l-0x01
endloop
debug else
debug call BJDebugMsg("ERROR: Invalid parameter")
endif
return i
endmethod
//> Int2Hex
// > Convert the decrypt var to a hex string for the encrypt var
method Int2Hex takes nothing returns nothing
//! textmacro 2hex
loop
set q=i/.Size
set s=.Int2Char(i-(q*.Size))+s
set k=k-0x01
set i=q
exitwhen k==0x00
endloop
//! endtextmacro
//========================================
local integer i=.Decrypt
local integer q=.Size
local integer k=0x01
local string s =null
if 0x7FFFFFFF>=.Decrypt then
loop
exitwhen q>=.Decrypt
set q=q*.Size
set k=k+0x01
endloop
//! runtextmacro 2hex()
elseif .maxInt>=i then
//Debug Maximal Int Size
set k=.maxHex
//! runtextmacro 2hex()
debug else
debug call BJDebugMsg("ERROR: Invalid parameter")
endif
set .Encrypt=s
endmethod
//> Int2HexEx
// > Convert the decrypt var to a hex string for the encrypt var
method Int2HexEx takes integer iEx returns string
local integer i=iEx
local integer q=.Size
local integer k=0x01
local string s =null
if 0x7FFFFFFF>=iEx then
loop
exitwhen q>=iEx
set q=q*.Size
set k=k+0x01
endloop
//! runtextmacro 2hex()
elseif .maxInt>=i then
//Debug Maximal Int Size
set k=.maxHex
//! runtextmacro 2hex()
debug else
debug call BJDebugMsg("ERROR: Invalid parameter")
endif
return s
endmethod
//==================================================
//String Operators
//> checkCharLibrary
// > Check if a char is in a library.
static method IsCharInLibrary takes string ch,string lib returns boolean
local integer l=StringLength(ch)
local integer z=StringLength(lib)
loop
exitwhen z<l
if ch==SubString(lib,z-l,z) then
return true
endif
set z=z-0x01
endloop
return false
endmethod
//> Int2CharEx
// > Convert an integer value to a char
method Int2CharEx takes integer i,string lib returns string
if i>=0x00 and i<=.Size then
return SubString(lib,i,i+0x01)
debug else
debug call BJDebugMsg("Error: Wrong char position")
endif
return null
endmethod
//> Char2IntEx
// > Convert an char to an integer value
method Char2IntEx takes string s,string lib returns integer
local integer l=StringLength(s)
local integer i=0x00
if l==1 then
loop
exitwhen i==.Size
if SubString(lib,i,i+0x01)==s then
return i
endif
set i=i+0x01
endloop
debug else
debug call BJDebugMsg("ERROR: Just enter one char")
endif
debug call BJDebugMsg("ERROR: Invalid parameter")
return -0x01
endmethod
//> setupCRC
// > Setup the CRC value. Remember to set before a decrypted value.
method setupCRC takes nothing returns nothing
local string s =I2S(.Decrypt)
local integer l=StringLength(s)
loop
exitwhen l==0x00
set .CRC=.CRC+.Char2Int(SubString(s,l-0x01,l))+R2I(Pow(0x02,l))
set l=l-0x01
endloop
endmethod
//> setupLength
// > Setup the length of a encrypted value. Remember to set before a decrypted value.
method setupLength takes nothing returns nothing
local integer i=.Extent
local integer q=.Size
local integer k=0x01
local string s =null
if 0x7FFFFFFF>=.Decrypt then
loop
exitwhen q>=.Extent
set q=q*.Size
set k=k+0x01
endloop
//! runtextmacro 2hex()
elseif .maxInt>=i then
//Debug Maximal Int Size
set k=.maxHex
//! runtextmacro 2hex()
debug else
debug call BJDebugMsg("ERROR: Invalid parameter")
endif
set .Length=StringLength(s)
endmethod
//> setupLibrary
// > This will setup the library which you'll need to decrypt/encrypt.
method setupLibrary takes string s returns nothing
local integer index=0x01
local integer ltemp=0x00
local integer temp =StringLength(s)-0x01
set .Library=s
set .Size =temp
loop
//0x7FFFFFFF == 2147483647
exitwhen temp>0x7FFFFFFF or temp<ltemp
set ltemp=temp
set temp =temp*.Size
set index=index+0x01
endloop
set .maxHex=index
set .maxInt=ltemp
endmethod
endstruct
public struct Generator
parameterLibrary array parameter[mparameterSize]
parameterLibrary key
string codeString
integer parameterSize
integer inParameterCRC
integer inKeyCRC
integer outParameterCRC
integer outKeyCRC
//==================================================
//onStructEvent Methods
static method create takes nothing returns thistype
local thistype iCook=thistype.allocate()
local integer i =mparameterSize-0x01
set iCook.codeString =null
set iCook.key =parameterLibrary.create()
set iCook.inParameterCRC =0x00
set iCook.outParameterCRC=0x00
set iCook.parameterSize =0x00
loop
exitwhen i<0x00
set iCook.parameter[i]=parameterLibrary.create()
set i=i-0x01
endloop
return iCook
endmethod
method onDestory takes nothing returns nothing
local integer i=mparameterSize-0x01
call .key.destroy()
loop
exitwhen i<0x00
call .parameter[i].destroy()
set i=i-0x01
endloop
endmethod
//==================================================
//Standart Methods
//> reset
// > This will reset your whole generator struct
method reset takes nothing returns nothing
local integer i=mparameterSize-0x01
call .key.destroy()
set .key=parameterLibrary.create()
loop
exitwhen i<0x00
call .parameter[i].destroy()
set .parameter[i]=parameterLibrary.create()
set i=i-0x01
endloop
endmethod
//> addDelemiters
// > Add some delimiters to your code (Hint: Just use this function after you have generated a codestring and before you added color to the string.)
method addDelimiters takes nothing returns nothing
local integer tl
local integer ti
local integer tp
local string ts
if .codeString!=null then
set tl=StringLength(.codeString)
set ti=0x00
set tp=0x00
set ts=null
loop
exitwhen ti==tl
if tp==delimiterInt then
set ts=ts+delimiterSign
set tp=0x01
else
set tp=tp+0x01
endif
set ts=ts+SubString(.codeString,ti,ti+0x01)
set ti=ti+0x01
endloop
set .codeString=ts
endif
endmethod
//> addDelemiters
// > Remove all delimiters from your code (Hint: Just use this function after you have generated a codestring and before you added some delimiters to the string.)
method removeDelimiters takes nothing returns nothing
local integer tl
local integer ti
local string tc
local string ts
if .codeString!=null then
set tl=StringLength(.codeString)
set ti=0x00
set ts=null
loop
exitwhen ti==tl
set tc=SubString(.codeString,ti,ti+0x01)
if tc!=delimiterSign then
set ts=ts+tc
endif
set ti=ti+0x01
endloop
set .codeString=ts
endif
endmethod
//> addColor
// > Add some color to your code (Hint: Just use this function after you have generated a codestring.)
method addColor takes nothing returns nothing
local integer m
local string t
local string d
if .codeString!=null then
set m=StringLength(.codeString)-0x01
set t=null
loop
exitwhen m<0x00
set d=SubString(.codeString,m,m+0x01)
if .key.IsCharInLibrary(d,signLibrary1) then
set d=colorcodeNum+d+"|r"
elseif .key.IsCharInLibrary(d,signLibrary2) then
set d=colorcodeabc+d+"|r"
elseif .key.IsCharInLibrary(d,signLibrary3) then
set d=colorcodeABC+d+"|r"
elseif .key.IsCharInLibrary(d,signLibrary4) then
set d=colorcodeXtr+d+"|r"
endif
set t=d+t
set m=m-0x01
endloop
set .codeString=t
endif
endmethod
//==================================================
//Set Methods
//> setParameter
// > Set the value of a parameter
method setParameter takes integer i,integer max,string lib returns nothing
if .parameterSize<mparameterSize then
set .parameter[.parameterSize].Active =true
set .parameter[.parameterSize].Decrypt=i
set .parameter[.parameterSize].Extent =max
call .parameter[.parameterSize].setupLibrary(lib)
call .parameter[.parameterSize].setupLength()
call .parameter[.parameterSize].setupCRC()
set .parameterSize=.parameterSize+0x01
debug else
debug call BJDebugMsg("Error: Wrong size")
endif
endmethod
//> setLoadParameter
// > Before you load a code you have to set the load parameter
method setLoadParameter takes integer max,string lib returns nothing
if .parameterSize<mparameterSize then
set .parameter[.parameterSize].Active =true
set .parameter[.parameterSize].Extent =max
call .parameter[.parameterSize].setupLibrary(lib)
call .parameter[.parameterSize].setupLength()
set .parameterSize=.parameterSize+0x01
debug else
debug call BJDebugMsg("Error: Wrong size")
endif
endmethod
//> setKey
// > Nearly for every function it's very important to have a key setted
method setKey takes string s,string lib returns nothing
local integer l=StringLength(s)
local integer q=0x00
local integer x
call .key.setupLibrary(lib)
loop
exitwhen l==0
set x=.key.Char2Int(SubString(s,l-0x01,l))
if x!=-0x01 then
set q=q+x
endif
set l=l-0x01
endloop
set .key.Decrypt=q
call .key.setupCRC()
set .outKeyCRC=.key.CRC
endmethod
//> setLoadCode
// > If you want to load a code you have to set the codeString first
method setLoadCode takes string s returns nothing
set .codeString=s
endmethod
//==================================================
//Reset Methods
//> resetLastParameter
// > If you want to reset you last setted parameter just use this function
method resetLastParameter takes nothing returns nothing
if .parameterSize>0x00 then
set .parameter[.parameterSize].Encrypt=null
set .parameter[.parameterSize].Library=null
set .parameter[.parameterSize].Decrypt=0x00
set .parameter[.parameterSize].Extent =0x00
set .parameter[.parameterSize].CRC =0x00
set .parameterSize=.parameterSize-0x01
debug else
debug call BJDebugMsg("Error: Wrong Size")
endif
endmethod
//==================================================
//Get Methods
//> getParameter
// > This function is there to get a decrypted parameter
method getParameter takes integer pos returns integer
return .parameter[pos].Decrypt
endmethod
//> getCode
// > After you have generated a code you can get with this function the code
method getCode takes nothing returns string
return .codeString
endmethod
//==================================================
//Check Methods
//> checkParameter
// > After you have decrypted a code you can check with this function if the checksum of the parameters is correct
method checkParameter takes nothing returns boolean
return .inParameterCRC==.outParameterCRC
endmethod
//> checkKey
// > After you have decrypted a code you can check with this function if the checksum of the key is correct
method checkKey takes nothing returns boolean
return .inKeyCRC==.outKeyCRC
endmethod
//==================================================
//Generating Methods
//> encrypt
// > After you have done all settings you can generate your own code
method encrypt takes nothing returns nothing
local integer index=.parameterSize-0x01
local integer ti
local integer te
local integer tl
local string pex
local string tsg
local string csg
loop
exitwhen index<0x00
if .parameter[index].Active then
set tsg=null
call SetRandomSeed(index*.key.CRC)
set .inParameterCRC=.inParameterCRC+(.parameter[index].CRC*(index+0x01))
set .parameter[index].Decrypt=ModuloInteger(.parameter[index].Decrypt+GetRandomInt(index,R2I(Pow(index,.key.CRC))),.parameter[index].Extent)
call .parameter[index].Int2Hex()
set tl=StringLength(.parameter[index].Encrypt)
if tl<.parameter[index].Length then
set tl =.parameter[index].Length-tl
set ti =0x00
loop
exitwhen ti==tl
call SetRandomSeed(R2I(Pow(ti,.key.CRC)))
set tsg=tsg+.parameter[index].Int2Char(ModuloInteger(GetRandomInt(0x00,.parameter[index].Size)-((ti+0x01)*index*(ti+0x01)),.parameter[index].Size))
set ti =ti+0x01
endloop
else
set ti=0x00
endif
set csg=null
set te =0x00
loop
exitwhen ti==.parameter[index].Length
call SetRandomSeed(R2I(Pow(ti,.key.CRC)))
set csg=csg+.parameter[index].Int2Char(ModuloInteger(.parameter[index].Char2Int(SubString(.parameter[index].Encrypt,te,te+0x01))+GetRandomInt(0x00,.parameter[index].Size)-((ti+0x01)*index*(ti+0x01)),.parameter[index].Size))
set ti=ti+0x01
set te=te+0x01
endloop
set .parameter[index].Encrypt=tsg+csg
endif
set index=index-0x01
endloop
set pex =.key.Int2HexEx(.inParameterCRC)
set index=.parameterSize-0x01
loop
exitwhen index<0x00
set .codeString=.parameter[index].Encrypt+.codeString
set index=index-0x01
endloop
call .key.Int2Hex()
set .codeString=.key.Encrypt+.codeString+pex
static if keyEncryption then
set index=StringLength(.codeString)
set csg =null
loop
exitwhen index==0x00
call SetRandomSeed(.key.CRC*(index+0x01))
set csg=.key.Int2Char(ModuloInteger(.key.Char2Int(SubString(.codeString,index-0x01,index))-GetRandomInt(0x00,.key.Size),.key.Size))+csg
set index=index-0x01
endloop
set .codeString=csg
endif
endmethod
//> decrypt
// > After you have done all settings you can decrypt an entered code
method decrypt takes nothing returns nothing
local parameterLibrary tk=parameterLibrary.create()
local boolean filter
local integer index
local integer pos
local integer te
local integer tl
local integer ti
local string ts
local string bs
static if keyEncryption then
set index=StringLength(.codeString)
set ts =null
loop
exitwhen index==0x00
call SetRandomSeed(.key.CRC*(index+0x01))
set ts=.key.Int2Char(ModuloInteger(.key.Char2Int(SubString(.codeString,index-0x01,index))+GetRandomInt(0x00,.key.Size),.key.Size))+ts
set index=index-0x01
endloop
set .codeString=ts
endif
call .key.Int2Hex()
call tk.setupLibrary(.key.Library)
set tl=StringLength(.key.Encrypt)
set tk.Encrypt=SubString(.codeString,0x00,tl)
call tk.Hex2Int()
call tk.setupCRC()
set .inKeyCRC=tk.CRC
set ts=SubString(.codeString,tl,StringLength(.codeString))
if .checkKey() then
set index=0x00
set pos =0x00
loop
exitwhen index==.parameterSize
if .parameter[index].Active then
set .parameter[index].Encrypt=SubString(ts,pos,pos+.parameter[index].Length)
set filter=false
set bs=null
set ti=0x00
set te=StringLength(.parameter[index].Encrypt)
loop
exitwhen ti==te
call SetRandomSeed(R2I(Pow(ti,tk.CRC)))
set tl=ModuloInteger(.parameter[index].Char2Int(SubString(.parameter[index].Encrypt,ti,ti+0x01))-GetRandomInt(0x00,.parameter[index].Size)+((ti+0x01)*index*(ti+0x01)),.parameter[index].Size)
if filter or tl!=0x00 then
set bs =bs+.parameter[index].Int2Char(tl)
set filter=true
endif
set ti=ti+0x01
endloop
if bs==null then
set bs=.parameter[index].Int2Char(0x00)
endif
set .parameter[index].Encrypt=bs
call .parameter[index].Hex2Int()
call SetRandomSeed(index*.key.CRC)
set .parameter[index].Decrypt=ModuloInteger(.parameter[index].Decrypt-GetRandomInt(index,R2I(Pow(index,.key.CRC))),.parameter[index].Extent)
call .parameter[index].setupCRC()
set .inParameterCRC=.inParameterCRC+(.parameter[index].CRC*(index+0x01))
set pos=pos+.parameter[index].Length
endif
set index=index+0x01
endloop
set .outParameterCRC=tk.Hex2IntEx(SubString(ts,pos,StringLength(ts)))
endif
call tk.destroy()
endmethod
endstruct
endlibrary