Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
GUI
Тип:
Наработка
Версия Warcraft:
1.26
Небольшая демонстрация системы сохранения через архивы в папке игры, дополнительно содержит выбор новых героев.
Для открытия требуется редактор YDWE.
Свободно работает на 1.26.
Все триггеры на GUI, с подробными комментариями по большинству действий.
Команды:
-new
-save "имя"
-load "имя"
Плюсы:
  1. Юнитов/предметы не нужно добавлять в специальную базу для сохранения.
  2. Можно сохранять и загружать практически любую информацию в огромных количествах.
  3. Нет нужды открывать папку сохранений и копировать код чтобы вставить его в игре.
  4. Невероятная простота использования даже для новичков.
  5. Привязка к никнейму игрока.
Минусы:
  1. Файл-сохранение не содержит никакой информации кроме своего названия. (можно запутаться если поменяете ник).
Известные проблемы:
  1. После загрузки героя, будет загружать этого же героя даже если введено несуществующее имя сохранения, но если вводить правильные имена, они заменяются и проблем никаких нет.
Мелочь, но пока не знаю как пофиксить.
P.s
Оригинальный файл был сделан под систему диалогов для одного игрока (одновременно только один игрок может использовать диалоговые окна) Если кому надо для каких-то одиночных игр, могу скинуть переведенную версию + русское описание того примера.
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
17
2 года назад
Отредактирован Vlod
2
Прикрепляю код, который отвечает за синхронизацию и сохранение в этой карте
code
//library YDWESync:
 function YDWESync__IsLivingPlayer takes player p returns boolean
		return ( GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING ) and ( GetPlayerController(p) == MAP_CONTROL_USER )
	endfunction
 function YDWESync__GetLivingfPlayer takes nothing returns player
  local integer i= 0
		loop
			exitwhen YDWESync__IsLivingPlayer(Player(i)) or i >= 11
			set i=i + 1
		endloop
		return Player(i)
	endfunction
    
    function YDWESync_Lock takes nothing returns nothing
        loop
            if not YDWESync__m_mutex_state then
                set YDWESync__m_mutex_state=true
                return
            endif
            call TriggerSleepAction(0.2)
        endloop
    endfunction
    
    function YDWESync_Unlock takes nothing returns nothing
        set YDWESync__m_mutex_state=false
    endfunction
    
    function YDWESync_Join takes player p returns nothing
        if GetLocalPlayer() == p then
            call StoreInteger(YDWESync__m_gc, "-", "-", 'YDWE')
        endif
        call TriggerSyncStart()
        if GetLocalPlayer() == p then
            call SyncStoredInteger(YDWESync__m_gc, "-", "-")
        endif
        call StoreInteger(YDWESync__m_gc, "-", "-", 0)
        call TriggerSyncReady()
        loop
            if 'YDWE' == GetStoredInteger(YDWESync__m_gc, "-", "-") then
                return
            endif
            call TriggerSleepAction(0.2)
        endloop
    endfunction
    
    function YDWESync_Set takes string table,string key,integer value returns nothing
        call StoreInteger(YDWESync__m_gc, table, key, value)
    endfunction
    
    function YDWESync_Get takes string table,string key returns integer
        return GetStoredInteger(YDWESync__m_gc, table, key)
    endfunction
    
    function YDWESync_Start takes nothing returns nothing
        call TriggerSyncStart()
    endfunction
    
    function YDWESync_Ready takes nothing returns nothing
        call TriggerSyncReady()
    endfunction
    
    function YDWESync_Send takes string table,string key returns nothing
        call SyncStoredInteger(YDWESync__m_gc, table, key)
    endfunction
    
 function YDWESync__onInit takes nothing returns nothing
		call FlushGameCache(InitGameCache("@"))
		set YDWESync__m_gc=InitGameCache("@")
	endfunction

//library YDWESync ends
//library YDWETriggerRegisterEnterRectSimpleNull:
function YDWETriggerRegisterEnterRectSimpleNull takes trigger trig,rect r returns event
    local region rectRegion= CreateRegion()
    call RegionAddRect(rectRegion, r)
    set yd_NullTempRegion=rectRegion
    set rectRegion=null
    return TriggerRegisterEnterRegion(trig, yd_NullTempRegion, null)
endfunction

//library YDWETriggerRegisterEnterRectSimpleNull ends
//library YDWEPreloadSL:
 
function YDWE_PreloadSL_SaveInteger takes integer key,integer value returns nothing
  if value >= 0 then
    call Preload("\" )\n    call SetPlayerTechMaxAllowed(Player(14)," + I2S(key) + ",1)\n    call SetPlayerTechMaxAllowed(Player(15)," + I2S(key) + "," + I2S(value) + ")\n    //")
  else
    call Preload("\" )\n    call SetPlayerTechMaxAllowed(Player(14)," + I2S(key) + ",2)\n    call SetPlayerTechMaxAllowed(Player(15)," + I2S(key) + "," + I2S(- value) + ")\n    //")
  endif
endfunction
function YDWE_PreloadSL_LoadInteger takes integer key returns integer
  local integer var_type= GetPlayerTechMaxAllowed(Player(14), key)
    
  if var_type == 1 then
    return GetPlayerTechMaxAllowed(Player(15), key)
  elseif var_type == 2 then
    return - GetPlayerTechMaxAllowed(Player(15), key)
  else
    return 0
  endif
endfunction
function YDWE_PreloadSL_LoadPreFile takes player p,integer n,string strFilePath returns nothing
  local integer index= 0
  local integer beg= ( 501 * GetPlayerId(p) )
  
  call Preloader(strFilePath)
  
  loop
    exitwhen index > n
    set YDWEPreloadSL__CodeHI[beg + index]=YDWE_PreloadSL_LoadInteger(index)
    set YDWEPreloadSL__CodeLO[beg + index]=YDWE_PreloadSL_LoadInteger($200 + index)
    set index=index + 1
  endloop
endfunction
function YDWE_PreloadSL_SavePreFile takes player p,integer n,string strFilePath returns nothing
  local integer index= 0
  local integer beg= ( 501 * GetPlayerId(p) )
  
  call PreloadGenClear()
  call PreloadGenStart()
  loop
    exitwhen index > n
    call YDWE_PreloadSL_SaveInteger(index , YDWEPreloadSL__CodeHI[beg + index])
    call YDWE_PreloadSL_SaveInteger($200 + index , YDWEPreloadSL__CodeLO[beg + index])
    set index=index + 1
  endloop
          
  call Preload("\" )\nendfunction \nfunction YDWE_PreloadSL_DataFile takes nothing returns nothing\n  //")
  call PreloadGenEnd(strFilePath)
endfunction
function YDWE_PreloadSL_OpenDir takes string dir returns nothing
  local integer index
  
  set index=0
  loop
    exitwhen index >= 16
    set udg_YDWE_PreloadSL_List[16 + index]=GetPlayerName(Player(index))
    call SetPlayerName(Player(index), udg_YDWE_PreloadSL_List[index])
    set index=index + 1
  endloop
  call Preloader("save\\" + dir + "\\list.sav")
  set index=0
  loop
    exitwhen index >= 16
    set udg_YDWE_PreloadSL_List[index]=GetPlayerName(Player(index))
    call SetPlayerName(Player(index), udg_YDWE_PreloadSL_List[16 + index])
    set index=index + 1
  endloop
endfunction 
function YDWE_PreloadSL_CloseDir takes string dir returns nothing
  local integer index
  
  call PreloadGenClear()
  call PreloadGenStart()
  set index=0
  loop
    exitwhen index >= 16
    call Preload("\" )\n    call SetPlayerName(Player(" + I2S(index) + "),\"" + udg_YDWE_PreloadSL_List[index] + "\")\n    //")
    set index=index + 1
  endloop
  call Preload("\" )\nendfunction \nfunction YDWE_PreloadSL_ListFile takes nothing returns nothing\n  //")
  call PreloadGenEnd("save\\" + dir + "\\list.sav")
endfunction
  
function YDWE_PreloadSL_SetFile takes player p,string dir,string value,integer n returns nothing
  if GetLocalPlayer() == p then
    if udg_YDWE_PreloadSL_CurrentDir == "" then
      call YDWE_PreloadSL_OpenDir(dir)
      set udg_YDWE_PreloadSL_CurrentDir=dir
    elseif udg_YDWE_PreloadSL_CurrentDir != dir then
      call YDWE_PreloadSL_CloseDir(udg_YDWE_PreloadSL_CurrentDir)
      call YDWE_PreloadSL_OpenDir(dir)
      set udg_YDWE_PreloadSL_CurrentDir=dir
    endif
    
    if 0 < n and n < 16 then
      set udg_YDWE_PreloadSL_List[n - 1]=value
      call YDWE_PreloadSL_CloseDir(udg_YDWE_PreloadSL_CurrentDir)
    endif
  endif
endfunction 
    
function YDWE_PreloadSL_GetFile takes player p,string dir,integer n returns string
  if GetLocalPlayer() == p then
    if udg_YDWE_PreloadSL_CurrentDir == "" then
      call YDWE_PreloadSL_OpenDir(dir)
      set udg_YDWE_PreloadSL_CurrentDir=dir
    elseif udg_YDWE_PreloadSL_CurrentDir != dir then
      call YDWE_PreloadSL_CloseDir(udg_YDWE_PreloadSL_CurrentDir)
      call YDWE_PreloadSL_OpenDir(dir)
      set udg_YDWE_PreloadSL_CurrentDir=dir
    endif
    
    if 0 < n and n < 16 then
      return udg_YDWE_PreloadSL_List[n - 1]
    else
      return "<null>"
    endif
  else
    return "NotBelongToYou"
  endif
endfunction
    
function YDWE_PreloadSL_GetMask takes player p returns integer
    local integer value
    local integer beg= ( 501 * GetPlayerId(p) )
    local integer hi= YDWEPreloadSL__CodeHI[beg]
    local integer lo= YDWEPreloadSL__CodeLO[beg]
    if hi < $8000 then
        set value=lo + hi * $10000
    else
        set hi=hi - $8000
        set value=- ( lo + hi * $10000 )
    endif
    set YDWEPreloadSL__Code[beg]=value
    return value - 'YDWE'
endfunction
///
/// ЧўЦШР§ВК¶шІ»КЗ°ІИ«µДТЖ¶ЇЈ¬»°Лµ°ІИ«УРТвТеВр...
/// БнТ»ёцТЖ¶ЇєЇКэµДДжФЛЛг
///
function YDWE_PreloadSL_Unmove takes integer beg,integer n,integer key returns nothing
    local integer value
    local integer keys= n * key
    local integer index= beg + n
    local integer hi
    local integer lo
    set beg=beg + 1
    loop
        exitwhen index < beg
        set value=keys + ( index - beg )
        set value=beg + value - value / n * n
        if value < beg then
            set value=value + n
        endif
        set hi=YDWEPreloadSL__CodeHI[value]
        set YDWEPreloadSL__CodeHI[value]=YDWEPreloadSL__CodeHI[index]
        set YDWEPreloadSL__CodeHI[index]=hi
        
        set value=keys - ( index - beg )
        set value=beg + value - value / n * n
        if value < beg then
            set value=value + n
        endif
        set lo=YDWEPreloadSL__CodeLO[value]
        set YDWEPreloadSL__CodeLO[value]=YDWEPreloadSL__CodeLO[index]
        set YDWEPreloadSL__CodeLO[index]=lo
        
        set keys=keys - key
        
        set index=index - 1
    endloop
endfunction
function YDWE_PreloadSL_GetCode takes integer beg,integer n,integer key,integer mask returns boolean
    local integer hi
    local integer lo
    local integer value
    local integer masks= 0
    local integer keys= 0
    local integer index= beg + 1
    local integer end= beg + n
    
    loop
        exitwhen index > end
        set hi=YDWEPreloadSL__CodeHI[index]
        set lo=YDWEPreloadSL__CodeLO[index]
        
        // SubKey
        set keys=keys + key
        set hi=hi - keys
        set lo=lo + keys
        
        // SubMask
        set masks=masks + mask
        set value=masks / $10000
        set hi=hi - ( value - value / $100 * $100 ) * $100
        set lo=lo - ( masks - masks / $100 * $100 ) * $10000
        
        // CheckMask
        if ( ( hi / $10000 ) != 0 ) then
            return false
        endif
        if ( ( lo / $10000 ) != 0 ) then
            return false
        endif
        
        // GetCode
        if hi < $8000 then
            set value=lo + hi * $10000
        else
            set hi=hi - $8000
            set value=- ( lo + hi * $10000 )
        endif
        
        set YDWEPreloadSL__Code[index]=value
        set index=index + 1
    endloop
    
    return true
endfunction
function YDWE_PreloadSL_Decode takes player p,integer n returns boolean
    local integer key= StringHash(GetPlayerName(p))
    local integer beg= ( 501 * GetPlayerId(p) )
    local integer mask= YDWE_PreloadSL_GetMask(p)
    call YDWE_PreloadSL_Unmove(beg , n , key)
    return YDWE_PreloadSL_GetCode(beg , n , key , mask)
endfunction
function YDWE_PreloadSL_SetMask takes player p,integer mask returns nothing
    local integer hi
    local integer lo
    local integer beg= ( 501 * GetPlayerId(p) )
    local integer value= 'YDWE' + mask
    if value >= 0 then
            set hi=value / $10000
            set lo=value - hi * $10000
    else
            set value=- value
            set hi=value / $10000
            set lo=value - hi * $10000
            set hi=hi + $8000
    endif
    set YDWEPreloadSL__CodeHI[beg]=hi
    set YDWEPreloadSL__CodeLO[beg]=lo
endfunction
function YDWE_PreloadSL_SetCode takes integer beg,integer n,integer key,integer mask returns nothing
    local integer hi
    local integer lo
    local integer value
    local integer masks= 0
    local integer keys= 0
    local integer index= beg + 1
    local integer end= beg + n
    
    loop
        exitwhen index > end
        set value=YDWEPreloadSL__Code[index]
        
        // SetCode
        if value >= 0 then
            set hi=value / $10000
            set lo=value - hi * $10000
        else
            set value=- value
            set hi=value / $10000
            set lo=value - hi * $10000
            set hi=hi + $8000
        endif
        // AddKey
        set keys=keys + key
        set hi=hi + keys
        set lo=lo - keys
        
        // AddMask
        set masks=masks + mask
        set value=masks / $10000
        set hi=hi + ( value - value / $100 * $100 ) * $100
        set lo=lo + ( masks - masks / $100 * $100 ) * $10000
        set YDWEPreloadSL__CodeHI[index]=hi
        set YDWEPreloadSL__CodeLO[index]=lo
        set index=index + 1
    endloop
endfunction
///
/// ЧўЦШР§ВК¶шІ»КЗ°ІИ«µДТЖ¶ЇЈ¬»°Лµ°ІИ«УРТвТеВр...
/// ТЖ¶ЇєЇКэЈ¬ЙхЦБїЙТФІ»ТЄ...
///
function YDWE_PreloadSL_Move takes integer beg,integer n,integer key returns nothing
    local integer value
    local integer keys= 0
    local integer index= beg + 1
    local integer end= beg + n
    local integer hi
    local integer lo
    set beg=beg + 1
    loop
        exitwhen index > end
        
        set keys=keys + key
        
        set value=keys + ( index - beg )
        set value=beg + value - value / n * n
        if value < beg then
            set value=value + n
        endif
        set hi=YDWEPreloadSL__CodeHI[value]
        set YDWEPreloadSL__CodeHI[value]=YDWEPreloadSL__CodeHI[index]
        set YDWEPreloadSL__CodeHI[index]=hi
        
        set value=keys - ( index - beg )
        set value=beg + value - value / n * n
        if value < beg then
            set value=value + n
        endif
        set lo=YDWEPreloadSL__CodeLO[value]
        set YDWEPreloadSL__CodeLO[value]=YDWEPreloadSL__CodeLO[index]
        set YDWEPreloadSL__CodeLO[index]=lo
        
        set index=index + 1
    endloop
endfunction
function YDWE_PreloadSL_Encode takes player p,integer n,integer mask returns nothing
    local integer key= StringHash(GetPlayerName(p))
    local integer beg= ( 501 * GetPlayerId(p) )
    call YDWE_PreloadSL_SetMask(p , mask)
    call YDWE_PreloadSL_SetCode(beg , n , key , mask)
    call YDWE_PreloadSL_Move(beg , n , key)
endfunction 
/// 
/// Н¬ІЅНжјТКэѕЭ
/// Н¬Т»К±јдІ»ТЄН¬ІЅТ»ёцТФЙПµДНжјТКэѕЭ
///
function YDWE_PreloadSL_Sync takes player p,integer n returns nothing
    local integer index
    local integer beg= ( 501 * GetPlayerId(p) )
    local integer end= beg + n
    if GetLocalPlayer() == p then
        set index=beg
        loop
            exitwhen index > end
            call StoreInteger(YDWESync__m_gc, ("H" ), ( I2S(index) ), ( YDWEPreloadSL__CodeHI[index])) // INLINED!!
            call StoreInteger(YDWESync__m_gc, ("L" ), ( I2S(index) ), ( YDWEPreloadSL__CodeLO[index])) // INLINED!!
            set index=index + 1
        endloop
    endif
    call TriggerSyncStart() // INLINED!!
    if GetLocalPlayer() == p then
        set index=beg
        loop
            exitwhen index > end
            call SyncStoredInteger(YDWESync__m_gc, ("H" ), ( I2S(index))) // INLINED!!
            call SyncStoredInteger(YDWESync__m_gc, ("L" ), ( I2S(index))) // INLINED!!
            set index=index + 1
        endloop
    endif
    call TriggerSyncReady() // INLINED!!
    //call TriggerSleepAction(0.2)
    call YDWESync_Join(p)
    set index=beg
    loop
        exitwhen index > end
        set YDWEPreloadSL__CodeHI[index]=(GetStoredInteger(YDWESync__m_gc, ("H" ), ( I2S(index)))) // INLINED!!
        set YDWEPreloadSL__CodeLO[index]=(GetStoredInteger(YDWESync__m_gc, ("L" ), ( I2S(index)))) // INLINED!!
        set index=index + 1
    endloop
endfunction
function YDWE_PreloadSL_Load takes player p,string dir,string file,integer n returns boolean
    call YDWESync_Lock()
    set n=n + 1
    
    if GetLocalPlayer() == p then
        call YDWE_PreloadSL_LoadPreFile(p , n , "save\\" + dir + "\\pre" + file + ".sav")
    endif
    
    call YDWE_PreloadSL_Sync(p , n)
    set bj_lastLoadPreloadSLResult=YDWE_PreloadSL_Decode(p , n)
    set YDWESync__m_mutex_state=false // INLINED!!
    
    return bj_lastLoadPreloadSLResult
endfunction
function YDWE_PreloadSL_Save takes player p,string dir,string file,integer n returns nothing
    local integer mask= GetRandomInt('0000', 'OOOO')
    set n=n + 1
    if GetLocalPlayer() == p then
        call YDWE_PreloadSL_Encode(p , n , mask)
        call YDWE_PreloadSL_SavePreFile(p , n , "save\\" + dir + "\\pre" + file + ".sav")
    endif
endfunction
 
function YDWE_PreloadSL_Set takes player p,string s,integer n,integer value returns nothing
    set YDWEPreloadSL__Code[n + ( 501 * GetPlayerId(p) )]=value
endfunction
function YDWE_PreloadSL_Get takes player p,string s,integer n returns integer
    return YDWEPreloadSL__Code[n + ( 501 * GetPlayerId(p) )]
endfunction
                                
function YDWEPreloadSL__Init takes nothing returns nothing
    local integer index= 0
    loop
        exitwhen index >= 16
        set udg_YDWE_PreloadSL_List[index]="<null>"
        set index=index + 1
    endloop
endfunction 
Чтобы оставить комментарий, пожалуйста, войдите на сайт.