• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

iGen

This bundle is marked as useful / simple. Simplicity is bliss, low effort and/or may contain minor bugs.
Preview: Hanky
Language: vJass
Requires: JassHelper (JassHelper 0.A.2.B)

Short Description:
This system is made to make the life easier for every map creator who needs save/load codes. In the map should be enough documentation how to use the system. If not ask questions per PM or visitor message.

Change Log said:
> 1.0 initial release
> 1.0a some bug fixes
> 1.0b added compressor
> 1.1 added documentation -> public release
> 1.1a added 2x protection and some more documentation
> 1.2 bug fix
improved compression
more possible options
improved name protection
improved crc function
functions are now easier
added some more documentation
> 1.2a bug fix
> 1.2b optimized compression
> 2.0 the whole script is rewritten and improved
> 2.0a added an option and changed some things that maybe could lead to an incorrect save/load code
> 2.0b just added the static if
> 2.0c improved the example for the system
> 2.1 fixed compression, save/load codes will be shorter from now on
> 2.1a fixed a bug found by acomc

JASS:
//				                          ,¦¦
//				                          ¦ ¦¦¦¦                                                                
//				                          ¦    ¦¦¦¦¦                          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

And as always greeting my clan NgO and some certain people:
- Darkt3mpl3r (pure win)
- JonNny
- Paladon
- Eccho
- Toadcop
- Berzeker
- WaRadius (miss ya mate)
- xxdingo93xx

Any improvement ideas will be helpful.

Keywords:
codegen, thecakeisaspy, savenload, save, load, code, ngo, hanky, darkt3mpl3r, igen
Contents

iGen x2.1 (Map)

Reviews
8 Sep 2011 Bribe: Deprecated in favor of: http://www.hiveworkshop.com/forums/spells-569/save-load-snippets-v1-0-0-7-a-202714/ 20:54, 22nd Aug 2009 hvo-busterkomo: The coding looks good and could definitely be useful. Approved.
Level 31
Joined
Jul 10, 2007
Messages
6,306
No. Instead the makers should be persuaded to switch.

Recall that beginners can't tell the difference between them and can't make a good choice ;P. That's why I say that inferior approved systems are dangerous =).

It's easier to get rid of them than it is to tell everyone what save/load system to use at every turn ;p.

edit
Ok, this is what Dr Super Good says (more or less)-

The community should raise the standards to that of Encoder v2. This allows for new systems (if any) to enter the market and gets rid of the older systems that don't make the cut.
 
Last edited:
Level 15
Joined
Mar 31, 2009
Messages
1,397
Recall that beginners can't tell the difference between them and can't make a good choice ;P. That's why I say that inferior approved systems are dangerous =).

It's easier to get rid of them than it is to tell everyone what save/load system to use at every turn ;p.


THATS WHAT I SAID... If you actually read my post you will see I said that existing maps should be persuaded to switch, instead of deleting them like you stated.
 
Level 2
Joined
May 1, 2011
Messages
19
Help me plz i suck with jass and cant fir iCook any where and it gives me errors

'Why it´s named iGen?

Well I used the name because I thought it´s kinda funny. If you look in the system you´ll also find the local variable named iCook.
It´s kinda an easteregg.:vw_wtf::vw_wtf:
WHERE IS IT:eekani:
 
Level 2
Joined
May 1, 2011
Messages
19
My argument is: why should something be approved that should never ever be used? : p

No, other save/load systems should be gotten rid of because they will just mislead people. You forget that beginners can't tell the difference between save/load systems, and optimal this and optimal that will just make them look for the easiest system possible rather than the best (because they think they're all around the same).

Approved is approved is a bad thing to uphold... if something is approved and something else comes along that's better, the first one should be graveyarded so that people don't accidentally use it. Why on earth would you want to lay traps on the site? It just makes it harder for map makers to find the good systems out of the thousands of bad systems and it makes it impossible for beginners to use anything that's any good.

I can see different systems that do the same things with pros and cons, but different systems that do the same thing where one is just plainly superior to another is just bad. I am speaking from experience here... back when I was a beginner, I ended up using AceHart's over Pipedream's because I couldn't tell the difference between them. This should have been graveyarded the day that Pipedream's came out (if it came out before his).

You shouldn't be proud of a system that nobody should ever use, rather you should be pushing this to be graveyarded as well. I know that I would push a system that I wrote to be graveyarded if another one came out that was better.

I honestly don't care what you think, i don't care who you are, I don't care about the rules, and I don't care about the mod's opinions. I care about the map makers who are looking through dozens of systems that all do around the same thing (only the vets end up knowing which ones are the best). Look at all of the save/load threads in World Editor Help Zone. People are still using iGen (some just starting in the last few days). They shouldn't be using this system, it is that simple >.<.

I don't play maps that use save/load systems other than Encoder now. I'm tired of typing in 50 char codes when they could just as easily be 25 characters. I find it stupid how stubborn so many people are being about this. I'm trying to put a stop to the 50 char codes, and you should be trying to put a stop to them as well. Supporting iGen is supporting 50 char codes over 25 char codes. I don't care about map makers complaining how hard a system is to use either, I primarily care about code length. It's the players that have to type in those codes.

Regardless, an approved system, if inferior to new ones, should be graveyarded as soon as possible so that people don't end up using it.



Who cares, you should see all the fights I get into with mods all the time.

I fight for giving 0 credit for resources used in maps.
I fight for getting rid of systems for newer systems, not just keeping things approved because they were good enough to be approved in the first place.

One of the things I warned people about is that I would be fighting for every single resource having to do with save/load on every site to be graveyarded and replaced with Encoder when v2 of it was finished, and I am keeping my word.

Dude Thats A F****** LONG TEXT FOR NOTHING :) but ya your right i would like it a lil simpler cuze im not good in jass but what can he do about it he cant .... remake it from all parts......:goblin_boom:
 
Level 2
Joined
Jul 11, 2011
Messages
6
Hello, I have problem installing your code. The proplem is
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
(07)CriticalErroe Can't define word: maybe missing enddefine?
This message isn't only in my map. If I try resaving yours, the error comes too. War3 unable to run the map. What should be done?
P.S. Does your system allow to save 300 types of items?
 
Level 14
Joined
Jan 15, 2007
Messages
349
Well I dont know about that error. It work for me. Remember to use the newest version of the jngp and jass helper (jass new gen pack, you'll find one on xgm.ru or wc3c.net).

Yes you can save whatever you want as long as you convert it to an integer (however you do it).

But I just can really recommend to use one of the other code generators. Since this one is pretty outdated. And now Im just to lazy to update this one (yeah maybe because warcraft is old and just a small amount of people use a system like this or any other code generator even if they use most use their own "modified" version where they don't care giving credit for your code, so cheers).
 
Level 31
Joined
Jul 10, 2007
Messages
6,306
Eh, you could make a good save/load system in 5 minutes if you used BigInt =P

For security, you can use Scrambler and KnuthChecksum.


Check JASS section.


You can also review all of the latest save/load security features in this resource's configuration area: http://www.hiveworkshop.com/forums/...-simple-low-level-save-load-framework-197557/



You can also review the latest in backwards compatible codes here: http://www.hiveworkshop.com/forums/showthread.php?t=197629&prev=search=save/load&d=list&r=20


However, for the ultimate in backwards compatible codes, you'd want to change the checksum by 1 for every version of your code.



For save/load, you want to be able to support at a minimum:
saving values (BigInt)
some sort of checksum (Knuth)

For general, you also want to be able to support backwards compatible codes.
 
Top