• 🏆 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 4
Joined
Jul 31, 2009
Messages
89
Code works fine in the test map, but when i copy it over to my map and i test it it just goes back to wc3 mains screen. Got latest jasshelper and it doesnt give me any error.
 
Level 4
Joined
Jul 31, 2009
Messages
89
:cool:
Ummm, first of all you need 1.24... and second of all, try compiling (ie saving the map) several (2 or 3) times before testing. And only use the test button directly after saving the map...

Yeah i've imported a lot of other codes and know that sometimes you need to re-save and test map directly after save. But this isn't the problem.

I tested to un-enable triggers one by one and the non working trigger is the save code example, 'SaveNLoad Exe'. I don't know what the problem is but maybe some kind of conflict with some other trigger?

Another thingy, My hero in my RPG is just a Unit if it could have something to do with it. (Everything is configured right in ObjectLibrary etc)
 
Level 14
Joined
Jan 15, 2007
Messages
349
Ok improved abit the compression of the code... I'll soon release a new version where you are able to modify really many things... but this version will be just for advanced users who know jass/vjass. But that don't mean that this version will be replaced I'll just add the second version of this system to the map... you'll be free to use the one you like more...
 
Level 14
Joined
Jan 15, 2007
Messages
349
The codegen is made for saving all integer amounts who are possible in warcraft 3. You can't directly save your hero or abilities you have to get for example their type id and add it then to the parameter... and if you want to save the ability levels of your hero then you just need to add the integer amount of the ability level to a parameter...

I guess I'll have some more documentation to the next version...
 
Level 8
Joined
Nov 20, 2008
Messages
445
So I'm trying to increase the integers saved from 13 to more but everytime i change it the load stops working.

It works perfectly with 13, when I make it 14 it always gives me wrong code. Is there anything else that needs to get changed except static constant integer pSize=14
and in the load the cg.size = 14
 
Level 14
Joined
Jan 15, 2007
Messages
349
Ya sorry, I ar teh busy in real life...

Well I think till the next week the codegen get updated with some nice features.. also I'll add some more documentation and more GUI examples so that GUIuser won't have any problems with the system...

Well I'll try to release the update as soon as possible...
 
Level 5
Joined
May 22, 2009
Messages
61
looks n1

BUT.. i tried to work with it, i failed xD
just want to save one integer (gold)

here are "my triggers": (only delete the other stats)

Code:
library SNL initializer init requires SaveNLoadUtilities
globals
  trigger a=CreateTrigger()
  trigger b=CreateTrigger()
endglobals

private function SaveGUIVars takes nothing returns nothing

  local CodeGen cg=CodeGen.createCode()
  
  call DisplayTimedTextToPlayer(udg_CG_Player,0.,0.,6.,"Here is your save/load code!")
  call cg.addKey(GetPlayerName(udg_CG_Player))
  call cg.addInt(udg_CG_Gold)
  call cg.compress()
  call cg.crypt()
  call TriggerSleepAction(1)
  call cg.cprint(udg_CG_Player)
  call cg.destroy()
endfunction



private function LoadGUIVars takes nothing returns nothing
  local CodeGen cg=CodeGen.createCode()
  local string s  =GetPlayerName(udg_CG_Player)
  
    call cg.read(udg_CG_LoadString)
    set cg.size=13
    call cg.addKey(s)
    call cg.encrypt()
    call cg.decompress()

    if cg.checkKey() and cg.checkSum() then
      set udg_CG_Gold=cg.getInt(1)
      call DisplayTimedTextToPlayer(udg_CG_Player,0.,0.,6.,"Code has been loaded.")
    else
      call BJDebugMsg("ERROR: Incorrect Code")
    endif
 
  call cg.destroy()
endfunction

private function init takes nothing returns nothing
  call TriggerAddAction(a,function SaveGUIVars)
  call TriggerAddAction(b,function LoadGUIVars)
endfunction
endlibrary

Code:
Load
    Ereignisse
        Player - Player 1 (RED) types a chat message containing -load as ... 
    Bedingungen
        CG_Load[(Player number of (Triggering player))] equal False
    Aktionen
        -------- Config Part --------
        Set CG_Player = (Triggering player)
        Set CG_LoadString = (Substring((Entered chat string), 7, (Length of (Entered chat string))))
        -------- Execution --------
        Custom script:   call TriggerExecute(b)
srry about that german words o_O

Code:
Save
    Ereignisse
        Spieler - Spieler 1 (Rot) types a chat message containing -save as Exakte Übereinstimmung
    Bedingungen
    Aktionen
        -------- Config Part --------
        Set CG_Player = (Triggering player)
        Set CG_Gold = (CG_Player Aktuelles Gold)
        -------- Execution --------
        Custom script:   call TriggerExecute(a)


i hope you can help me ^^
 

Attachments

  • ngocodegen1.2b (edit).w3x
    36.3 KB · Views: 42
Level 14
Joined
Jan 15, 2007
Messages
349
You have to wait until the update... it would be senseless if I would help you now because after the update there's a new script...

Edit: Im sorry for not releasing the system this weekend. But Im working on the system that it can be soon released. I hope that I can release it at least this week...
 
Last edited:
Level 8
Joined
Aug 2, 2008
Messages
193
Hi,

okay then it's okay :D
And _could_ you add the possibility, that you can change the size during saving?
Cause I need in my RPG one Code, which stores up to 14 Integers and on which stores 32^^
And if I change the size in the codegen itself to 32, the code for the hero is also extrem huge^^
So I use two different CodeGens for this save codes XD
 
Level 4
Joined
Sep 25, 2009
Messages
49
Well i tryed to use this but when i tryed to test map it i came up with some 600 complie errors, so i saved a few times then tryed and it came up with 24. and its just saying at 24, and when i try to re-enable the save/load triggers its saying
" 'The trigger Codegen byhankey' must have an initialization function called 'InitTrig_CodeGen_ByHaneky'".
 
Level 14
Joined
Jan 15, 2007
Messages
349
The status is right that 50% of the script are written already. The other 50% will come soon. When the script is finished I just need to add some documentation. I guess that I'll have today some time ... to maybe finish the script. But well Im just guessing.
 
Level 9
Joined
Jun 3, 2009
Messages
486
so i can save a character and when i load him it will have the same spells it had when i saved it??
 
Level 14
Joined
Jan 15, 2007
Messages
349
Sure you can already make it, it's just up to you. Since you have to set the setting. Well whatever, I'll try till sunday to update this version. Im not sure if I can add all examples till then but I try my best.
 
Level 9
Joined
Oct 17, 2007
Messages
547
Thanks, i'm clueless at JASS so probably it'll help me out a lot to point out which part I can edit to make the system save additional stuff. Thanks
 
Level 8
Joined
Nov 20, 2008
Messages
445
Everything you need to change to save more stuff is already documented with comments. You just need to wait for the next version to actually fix some bugs preventing you from doing so.
 
Level 9
Joined
Oct 17, 2007
Messages
547
Im clueless to what teh JASS code said so even if there were no bugs I would not attempt at trying to mod the system since it will end up not working.
 
Level 4
Joined
Sep 25, 2009
Messages
49
I downloaded and ran the JNPG pack World editor one... (Version 5d) and when i saved the map, it came up with 100 compile errors...


EDIT: Never mind it seems there was a problem with the WE on my end, i re-downloaded the pack and saved the map again and i got no more PJass errors. Anyways thanks for your help, ill test it and get back to you :)
 
Last edited:
Level 9
Joined
Oct 17, 2007
Messages
547
Can you also add this feature if you haven't consider it yet. If a hero picks up a permanent HP increase item and and got its life increase by a certain amount, can you make sure the system saves it too?
 
Top