SoUI 0.5版本占坑
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

569 lines
19 KiB

3 years ago
#ifndef YDWENewItemsFormulaIncluded
#define YDWENewItemsFormulaIncluded
#include "YDWEBase.j"
library YDWEStringFormula initializer Init requires YDWEBase
globals
item bj_lastCombinedItem=null
endglobals
function GetLastCombinedItem takes nothing returns item
return bj_lastCombinedItem
endfunction
//===========================================================================
//<EFBFBD><EFBFBD>Ʒ<EFBFBD>ϳ<EFBFBD>
globals
private trigger array ItemCombineEventQueue
private integer ItemCombineEventNumber = 0
endglobals
function YDWESyStemItemCombineTriggerAction takes nothing returns nothing
local integer i = 0
loop
exitwhen i >= ItemCombineEventNumber
if ItemCombineEventQueue[i] != null and TriggerEvaluate(ItemCombineEventQueue[i]) and IsTriggerEnabled(ItemCombineEventQueue[i]) then
call TriggerExecute(ItemCombineEventQueue[i])
endif
set i = i + 1
endloop
endfunction
//GetLastMovedItemInItemSlot
//===========================================================================
//<EFBFBD><EFBFBD>Ʒ<EFBFBD>ϳ<EFBFBD><EFBFBD>¼<EFBFBD>
//===========================================================================
function YDWESyStemItemCombineRegistTrigger takes trigger trg returns nothing
set ItemCombineEventQueue[ItemCombineEventNumber] = trg
set ItemCombineEventNumber = ItemCombineEventNumber + 1
endfunction
private struct Inventory
method reset takes nothing returns nothing
call YDWEFlushMissionByString("YDWEStringFormula."+I2S(this))
endmethod
method onDestroy takes nothing returns nothing
call YDWEFlushMissionByString("YDWEStringFormula."+I2S(this))
endmethod
endstruct
private struct StringTable extends Inventory
method operator [] takes string key returns integer
return YDWEGetIntegerByString("YDWEStringFormula."+I2S(this), key)
endmethod
method operator []= takes string key, integer value returns nothing
call YDWESaveIntegerByString("YDWEStringFormula."+I2S(this), key, value)
endmethod
method flush takes string key returns nothing
call YDWEFlushStoredIntegerByString("YDWEStringFormula."+I2S(this), key)
endmethod
method exists takes string key returns boolean
return YDWEHaveSavedIntegerByString("YDWEStringFormula."+I2S(this), key)
endmethod
endstruct
//***************************************************************
//* StringFormula 2.0 - Fetrix_sai
//* ------------
//*
//***************************************************************
private keyword ItemIdMatrix
private keyword FormulaMatrix
private keyword Sorting
globals
private constant integer MAX_INSTANCES = 8100
private constant integer SEGMENT_LENGTH = 4
endglobals
private function Convert takes integer value, integer length returns string
local string Char = I2S(value)
local integer slen = StringLength(Char)
loop
exitwhen slen >= length
set Char = "0" + Char
set slen = slen + 1
endloop
return Char
endfunction
////////////////////////////////////////////////////////////
//////////////////// __ItemId Matrix__ /////////////////////
private struct ItemIdMatrix extends array [MAX_INSTANCES]
static StringTable Data
static integer Total = 1
integer itemId
string keyStr
integer keyLen
static method get takes integer id returns thistype
return .Data[I2S(id)]
endmethod
static method exists takes integer id returns boolean
return .Data.exists(I2S(id))
endmethod
method sub takes integer segment returns integer
local integer start = .keyLen * segment + 1
return S2I(SubString(.keyStr, start, (start + .keyLen)))
endmethod
static method assigns takes integer id returns thistype
local thistype this = 0
if id == null or id == 0 then
return 0
endif
set this = thistype.get(id)
if integer(this) > 0 then
return this
endif
set this = thistype[.Total]
set this.itemId = id
set this.keyStr = I2S(SEGMENT_LENGTH)
set this.keyLen = SEGMENT_LENGTH
set .Data[I2S(id)] = integer(this)
set .Total = .Total + 1
return this
endmethod
method memory takes string key returns nothing
set .keyStr = .keyStr + key
//debug call BJDebugMsg("|cff00ff00KEY: |r" + .keyStr)
endmethod
private static method onInit takes nothing returns nothing
set .Data = StringTable.create()
endmethod
endstruct
////////////////// __End of ItemId Matrix__ ////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
//////////////////// __Formula Matrix__ ////////////////////
globals
private FormulaMatrix FormulaData = 0
endglobals
private struct FormulaMatrix extends array [MAX_INSTANCES]
static StringTable Data
static integer Total = 1
string formula
integer segmLen
string model
string message
integer chance
boolean delete
static method exists takes string s returns boolean
return .Data.exists(s)
endmethod
method sub takes integer segment returns integer
local integer start = .segmLen * segment + 1
return S2I(SubString(.formula, start, (start + .segmLen)))
endmethod
static method memory takes integer lingth, string formStr, ItemIdMatrix eventually returns thistype
local thistype this = 0
if FormulaMatrix.exists(formStr) then
//debug call BJDebugMsg("|cffff0000Registration cannot be repeated !!|r")
return 0
endif
set this = thistype[thistype.Total]
set this.formula = formStr + Convert(eventually, SEGMENT_LENGTH)
set this.segmLen = lingth
set this.model = null //"Abilities\\Spells\\Items\\AIam\\AIamTarget.mdl"
set this.message = null //"|cff00ff00<EFBFBD><EFBFBD><EFBFBD>ϳ<EFBFBD><EFBFBD>ˣ<EFBFBD>|r"
set this.chance = 100
set this.delete = false
set .Data[formStr] = integer(this)
set .Total = .Total + 1
//debug call BJDebugMsg("|cff00ff00Formula Register: |r" + I2S(integer(this)) + ". " + this.formula)
return this
endmethod
private static method onInit takes nothing returns nothing
set .Data = StringTable.create()
endmethod
endstruct
////////////////// __End of Formula Matrix__ ///////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
//////////////////// __Formula Sorting__ ///////////////////
private struct Sorting
ItemIdMatrix array stack[8]
integer array count[8]
integer total = 7
method onDestroy takes nothing returns nothing
local integer i = 0
loop
exitwhen i == stack.size
set .stack[i] = 0
set .count[i] = 0
set i = i + 1
endloop
set .char = ""
endmethod
static method create takes integer type1, integer n1, integer type2, integer n2, integer type3, integer n3,/*
*/ integer type4, integer n4, integer type5, integer n5, integer type6, integer n6, integer type7, integer n7 returns thistype
local thistype this = thistype.allocate()
set this.stack[1] = ItemIdMatrix.assigns(type1)
set this.stack[2] = ItemIdMatrix.assigns(type2)
set this.stack[3] = ItemIdMatrix.assigns(type3)
set this.stack[4] = ItemIdMatrix.assigns(type4)
set this.stack[5] = ItemIdMatrix.assigns(type5)
set this.stack[6] = ItemIdMatrix.assigns(type6)
set this.stack[7] = ItemIdMatrix.assigns(type7)
set this.count[1] = n1
set this.count[2] = n2
set this.count[3] = n3
set this.count[4] = n4
set this.count[5] = n5
set this.count[6] = n6
set this.count[7] = n7
return this
endmethod
string char
method convert takes nothing returns string
local integer i = 1
local integer j
local integer k
set .char = ""
loop
exitwhen i > .total
if .stack[i] == 0 or .count[i] == 0 then
set .stack[i] = .stack[.total]
set .count[i] = .count[.total]
set .total = .total - 1
set i = i - 1
else
set j = i + 1
loop
exitwhen j > .total
if .stack[j] == 0 or .count[j] == 0 then
set .stack[j] = .stack[.total]
set .count[j] = .count[.total]
set .total = .total - 1
set j = j - 1
elseif integer(.stack[i]) > integer(.stack[j]) then
set k = .stack[i]
set .stack[i] = .stack[j]
set .stack[j] = k
set k = .count[i]
set .count[i] = .count[j]
set .count[j] = k
elseif integer(.stack[i]) == integer(.stack[j]) then
set .count[i] = .count[i] + .count[j]
set .stack[j] = 0
set j = j - 1
endif
set j = j + 1
endloop
set j = .count[i]
loop
exitwhen j == 0
set .char = .char + Convert(.stack[i], SEGMENT_LENGTH)
set j = j - 1
endloop
endif
set i = i + 1
endloop
return .char
endmethod
endstruct
////////////////// __End of Formula Sorting__ //////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
/////////////////////// __Craft Item__ /////////////////////
private function Adaptation takes nothing returns boolean
return true
endfunction
private function verify takes nothing returns boolean
return ItemIdMatrix.exists(GetItemTypeId(GetManipulatedItem()))
endfunction
private function GetCharges takes item it returns integer
local integer charges = GetItemCharges(it)
if charges == 0 then
set charges = 1
endif
return charges
endfunction
private function CraftItem takes nothing returns nothing
local FormulaMatrix forx = 0
local ItemIdMatrix itmx = ItemIdMatrix.get(GetItemTypeId(GetManipulatedItem()))
local integer size = StringLength(itmx.keyStr) / itmx.keyLen
local integer inst = 0
local integer numb = 0
local integer sum = 0
local integer tmpid = 0
local integer i = 0
local integer j = 0
local boolean b = false
local item it = null
local item article = GetManipulatedItem()
local unit caster = GetTriggerUnit()
local item array items
local integer array typeid
local integer array amount
local integer array surplus
//* Check Slots
set i = 0
loop
exitwhen i == 6
set it = UnitItemInSlot(caster, i)
if it != null then
set sum:items = it
set sum:typeid = GetItemTypeId(it)
set sum:amount = GetCharges(it)
if it == article then
set b = true
endif
set sum = sum + 1
endif
set i = i + 1
set it = null
endloop
if b == false then
set sum:items = article
set sum:typeid = GetItemTypeId(article)
set sum:amount = 1
set sum = sum + 1
endif
//* Check Formulas
loop
exitwhen inst == size
set forx = FormulaMatrix(itmx.sub(inst))
set numb = StringLength(forx.formula) / forx.segmLen - 1
set i = 0
loop
exitwhen i == sum
set i:surplus = i:amount
set i = i + 1
endloop
//! Check Formula
set i = 0
loop
set tmpid = ItemIdMatrix(forx.sub(i)).itemId
exitwhen i == numb
set j = 0
loop
exitwhen j == sum
if j:typeid == tmpid and j:surplus > 0 then
set j:surplus = j:surplus - 1
exitwhen true
endif
set j = j + 1
endloop
exitwhen j == sum
set i = i + 1
endloop
//! Merge item
if i == numb then
if GetRandomInt(0, 99) < forx.chance then
//! effect and text
if forx.model != null then
call DestroyEffect(AddSpecialEffectTarget(forx.model, caster, "origin"))
endif
if forx.message != null then
call DisplayTimedTextToPlayer(GetTriggerPlayer(), 0, 0, 30, forx.message)
endif
//! remove item
set i = 0
loop
exitwhen i == sum
if i:surplus > 0 and GetItemCharges(i:items) > 0 then
call SetItemCharges(i:items, i:surplus)
elseif i:surplus == 0 then
call RemoveItem(i:items)
endif
set i = i + 1
endloop
//! add item
set it = CreateItem(tmpid, GetUnitX(caster), GetUnitY(caster))
if GetItemCharges(it) > 0 then
call SetItemCharges(it, 1)
set i = 0
loop
exitwhen i == sum
if i:typeid == tmpid then
call RemoveItem(i:items)
call SetItemCharges(it, i:surplus + 1)
endif
set i = i + 1
endloop
endif
call UnitAddItem(caster, it)
set bj_lastCombinedItem = it
call YDWESyStemItemCombineTriggerAction()
elseif forx.delete then
//! remove item
set i = 0
loop
exitwhen i == sum
if i:surplus > 0 and GetItemCharges(i:items) > 0 then
call SetItemCharges(i:items, i:surplus)
elseif i:surplus == 0 then
call RemoveItem(i:items)
endif
set i = i + 1
endloop
endif
set it = null
exitwhen true
endif
set inst = inst + 1
endloop
if b == false /*and GetItemType(article) == ITEM_TYPE_POWERUP*/ then
call RemoveItem(article)
endif
set i = 0
loop
exitwhen i == sum
set i:items = null
set i = i + 1
endloop
set article = null
set caster = null
set it = null
endfunction
private function Init takes nothing returns nothing
local filterfunc f = Filter(function Adaptation)
local trigger t = CreateTrigger()
local integer i = 0
loop
exitwhen i > 15
call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_PICKUP_ITEM, f)
set i = i + 1
endloop
call TriggerAddCondition(t, Condition(function verify))
call TriggerAddAction(t, function CraftItem)
call DestroyFilter(f)
set f = null
set t = null
endfunction
///////////////////// __End of Craft Item__ ////////////////
////////////////////////////////////////////////////////////
// call YDWENewItemsFormula('rat6', 6, 'rat9', 5, 'ratc', 4, 'rde1', 3, 'rde2', 2, 'rde3', 1, 'mcou')
function YDWENewItemsFormula takes integer type1, integer n1, integer type2, integer n2, integer type3, integer n3, /*
*/ integer type4, integer n4, integer type5, integer n5, integer type6, integer n6, integer eventually returns nothing
local Sorting sort = Sorting.create(type1, n1, type2, n2, type3, n3, type4, n4, type5, n5, type6, n6, 0, 0)
local ItemIdMatrix itmx = ItemIdMatrix.assigns(eventually)
local string f = I2S(SEGMENT_LENGTH) + sort.convert()
local string s = ""
local integer i = 0
set FormulaData = FormulaMatrix.memory(SEGMENT_LENGTH, f, itmx)
if integer(FormulaData) > 0 then
set s = Convert(integer(FormulaData), SEGMENT_LENGTH)
set i = 0
loop
exitwhen i > sort.total
call sort.stack[i].memory(s)
set i = i + 1
endloop
call itmx.memory(s)
endif
call sort.destroy()
set f = ""
set s = ""
endfunction
endlibrary
#endif /// YDWENewItemsFormulaIncluded