luorax
Invasion in Duskwood
- Reaction score
- 67
I didn't want to post this library, but I saw that someone has problems with quest. Then I decided to post this, maybe it'll help people's work a bit.
The system uses operators instead of methods or functions. I used Earth-Fury's library (Board), and I liked the API.
Each method (operator) can work in "generic" and in "single-player" mode. It means you can set the quest's value to something for each player, or only for one player.
For more information read the description in the library.
Requires:
-ARGB
The test map contains a simple quest to show how do the system works.
Changelog:
1.0.0 >> 12.08.2010
-First release
1.0.1 >> 12.09.2010
-Minor bug & logical fail fixes
-New Quest.duplicate() method
1.0.2 >> 12.09.2010.
-Runtime speed improvements
Please tell me your opinion and suggestions, and let me know if you found a bug.
The system uses operators instead of methods or functions. I used Earth-Fury's library (Board), and I liked the API.
Each method (operator) can work in "generic" and in "single-player" mode. It means you can set the quest's value to something for each player, or only for one player.
For more information read the description in the library.
Requires:
-ARGB
JASS:
library QuestStruct requires ARGB
//==============================================================================
// QuestStruct v1.0.2
//==============================================================================
// Credits:
//------------------------------------------------------------------------------
// Written By:
// Luorax
//
// API inspiration:
// Earth-Fury
//
// Requires:
// -ARGB by Vexorian
//
//==============================================================================
// Quest API
//==============================================================================
// To create a new Quest, use the example below. That'll create a new blank
// quest.
//
// local Quest myquest = Quest.create()
//
//------------------------------------------------------------------------------
// Now you can do 2 things:
// ???????????????????????
// -You can set its data generally, for all player. To do so use the next
// syntax:
//
// set myquest.title = "Test 1"
//
// -You can set its for one player only. To do so:
//
// set myquest.title[Player(0)] = "Test 1"
//
// That syntax works with each operator.
//
// You can get a member's value in two way:
//
// -In MPI mode do the next:
//
// local string s = myquest.title[Player(X)]
//
// -In basic mode each player's value is the same, so you work with Player 1's
// values.
//
//------------------------------------------------------------------------------
//
// You can also duplicate a Quest. Just call the next method:
//
// local Quest myquest2 = myquest.duplicate()
//
// That'll create a new Quest, and will duplicate each QuestItem.
//
//------------------------------------------------------------------------------
// The list of the available operators (the names're self-speaking):
// ?????????????????????????????????????????????????????????????????
//
/*
NAME REQUIRES DEFAULT
???? ???????? ????????
failed = boolean false
completed = boolean false
visible = boolean true
required = boolean true
discovered = boolean true
textColorize = boolean true
titleColorize = boolean true
icon = string ""
title = string ""
text = string ""
data = integer 0
titleColor = ARGB 0xFFFFFF
textColor = ARGB 0xFFFFFF
*/
//
//------------------------------------------------------------------------------
// NOTE!
// If you're using the next syntax:
//
// set myquest.data = Extra.create(21, 24)
//
// then it'll create a new "Extra" type struct, and set each player's data to it.
// If you need different values per player, then you'll need a loop, and you have to
// create it for each player.
//
//==============================================================================
// QuestItem API
//==============================================================================
// To create a new QuestItem, use the example below. That'll create a new blank
// questitem.
//
// local QuestItem myquestitem = QuestItem.create(myquest)
//
//------------------------------------------------------------------------------
// Now you can do 2 things:
// ???????????????????????
// -You can set its data generally, for all player. To do so use the next
// syntax:
//
// set myquestitem.text = "Test 1"
//
// -You can set its for one player only. To do so:
//
// set myquestitem.text[Player(0)] = "Test 1"
//
// That syntax works with each operator.
//
//------------------------------------------------------------------------------
// The owner Quest struct is stored in the QuestItem struct, and you can access
// it using the syntax below:
//
// set myquestitem.qOwner.title = "Test "
//
//
// You can also duplicate a quest item. Just call the next method:
//
// local QuestItem myquestitem2 = myquestitem.duplicate(myquest)
//
// That'll create a new QuestItem attached to "myquest", and fill it with
// myquestitem's variables' values.
//
//------------------------------------------------------------------------------
// The list of the available operators (the names're self-speaking):
// ?????????????????????????????????????????????????????????????????
//
/*
NAME REQUIRES DEFAULT
???? ???????? ????????
colorize = boolean true
completed = boolean false
color = ARGB 0xFFFFFF
text = string ""
data = integer 0
*/
//
//==============================================================================
// Configuration
//==============================================================================
globals
constant integer MAX_QUESTITEMS = 5
endglobals
//
// Maybe I'll add more, just give me ideas
//
//==============================================================================
// Here begins the code. Don't touch it, if you don't know how it works!
//==============================================================================
private function ErrorMsg takes string what, string error returns nothing
call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 60, "Quest Error: " + what + ": " + error)
endfunction
private constant function B2S takes boolean b returns string
if b then
return "true"
endif
return "false"
endfunction
// ============================================================
// Operator Structs (For , .data[], .title[], etc)
// ============================================================
// Quest Visibility
// ============================================================
private struct OperatorVisible extends array
public method operator []= takes player p, boolean b returns nothing
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.visible[\"" + GetPlayerName(p) + "\"]=" + B2S(b), "Given player is a neutral player")
return
endif
set Quest(this).bVisible[id] = b
if GetLocalPlayer() == p then
call QuestSetEnabled(Quest(this).qQuest, b)
endif
endmethod
public method operator [] takes player p returns boolean
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.visible[\"" + GetPlayerName(p) + "\"]", "Given player is a neutral player")
return false
endif
return Quest(this).bVisible[id]
endmethod
endstruct
// Quest Required
// ============================================================
private struct OperatorRequired extends array
public method operator []= takes player p, boolean b returns nothing
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.required[\"" + GetPlayerName(p) + "\"]=" + B2S(b), "Given player is a neutral player")
return
endif
set Quest(this).bRequired[id] = b
if GetLocalPlayer() == p then
call QuestSetRequired(Quest(this).qQuest, b)
endif
endmethod
public method operator [] takes player p returns boolean
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.required[\"" + GetPlayerName(p) + "\"]", "Given player is a neutral player")
return false
endif
return Quest(this).bRequired[id]
endmethod
endstruct
// Quest Discovered
// ============================================================
private struct OperatorDiscovered extends array
public method operator []= takes player p, boolean b returns nothing
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.discovered[\"" + GetPlayerName(p) + "\"]=" + B2S(b), "Given player is a neutral player")
return
endif
set Quest(this).bDiscovered[id] = b
if GetLocalPlayer() == p then
call QuestSetDiscovered(Quest(this).qQuest, b)
endif
endmethod
public method operator [] takes player p returns boolean
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.discovered[\"" + GetPlayerName(p) + "\"]", "Given player is a neutral player")
return false
endif
return Quest(this).bDiscovered[id]
endmethod
endstruct
// Quest Failed
// ============================================================
private struct OperatorFailed extends array
public method operator []= takes player p, boolean b returns nothing
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.failed[\"" + GetPlayerName(p) + "\"]=" + B2S(b), "Given player is a neutral player")
return
endif
set Quest(this).bFailed[id] = b
if GetLocalPlayer() == p then
call QuestSetFailed(Quest(this).qQuest, b)
endif
endmethod
public method operator [] takes player p returns boolean
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.failed[\"" + GetPlayerName(p) + "\"]", "Given player is a neutral player")
return false
endif
return Quest(this).bFailed[id]
endmethod
endstruct
// Quest Completed
// ============================================================
private struct OperatorCompleted extends array
public method operator []= takes player p, boolean b returns nothing
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.completed[\"" + GetPlayerName(p) + "\"]=" + B2S(b), "Given player is a neutral player")
return
endif
set Quest(this).bCompleted[id] = b
if GetLocalPlayer() == p then
call QuestSetCompleted(Quest(this).qQuest, b)
endif
endmethod
public method operator [] takes player p returns boolean
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.completed[\"" + GetPlayerName(p) + "\"]", "Given player is a neutral player")
return false
endif
return Quest(this).bCompleted[id]
endmethod
endstruct
// Quest Data
// ============================================================
private struct OperatorData extends array
public method operator []= takes player p, integer data returns nothing
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.data[\"" + GetPlayerName(p) + "\"]=" + I2S(data), "Given player is a neutral player")
return
endif
set Quest(this).iData[id] = data
endmethod
public method operator [] takes player p returns integer
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.data[\"" + GetPlayerName(p) + "\"]", "Given player is a neutral player")
return 0
endif
return Quest(this).iData[id]
endmethod
endstruct
// Quest Icon
// ============================================================
private struct OperatorIcon extends array
public method operator []= takes player p, string s returns nothing
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.icon[\"" + GetPlayerName(p) + "\"]=" + s, "Given player is a neutral player")
return
endif
set Quest(this).sIcon[id] = s
if GetLocalPlayer() == p then
call QuestSetIconPath(Quest(this).qQuest, s)
endif
endmethod
public method operator [] takes player p returns string
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.icon[\"" + GetPlayerName(p) + "\"]", "Given player is a neutral player")
return ""
endif
return Quest(this).sIcon[id]
endmethod
endstruct
// Quest Title
// ============================================================
private struct OperatorTitle extends array
public method operator []= takes player p, string s returns nothing
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.title[\"" + GetPlayerName(p) + "\"]=" + s, "Given player is a neutral player")
return
endif
set Quest(this).sTitle[id] = s
if GetLocalPlayer() == p then
if Quest(this).bTitleColorize[id] then
call QuestSetTitle(Quest(this).qQuest, Quest(this).aTitleColor[id].str(s))
else
call QuestSetTitle(Quest(this).qQuest, s)
endif
endif
endmethod
public method operator [] takes player p returns string
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.title[\"" + GetPlayerName(p) + "\"]", "Given player is a neutral player")
return ""
endif
return Quest(this).sTitle[id]
endmethod
endstruct
// Quest Title Color
// ============================================================
private struct OperatorTitleColor extends array
public method operator []= takes player p, ARGB color returns nothing
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.titlecolor[\"" + GetPlayerName(p) + "\"]" , "Given player is a neutral player")
return
endif
set Quest(this).aTitleColor[id] = color
if GetLocalPlayer() == p then
if Quest(this).bTitleColorize[id] then
call QuestSetTitle(Quest(this).qQuest, color.str(Quest(this).sTitle[id]))
else
call QuestSetTitle(Quest(this).qQuest, Quest(this).sTitle[id])
endif
endif
endmethod
public method operator [] takes player p returns ARGB
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.titlecolor[\"" + GetPlayerName(p) + "\"]", "Given player is a neutral player")
return 0
endif
return Quest(this).aTitleColor[id]
endmethod
endstruct
// Quest Text
// ============================================================
private struct OperatorText extends array
public method operator []= takes player p, string s returns nothing
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.text[\"" + GetPlayerName(p) + "\"]=" + s, "Given player is a neutral player")
return
endif
set Quest(this).sText[id] = s
if GetLocalPlayer() == p then
if Quest(this).bTextColorize[id] then
call QuestSetDescription(Quest(this).qQuest, Quest(this).aTextColor[id].str(s))
else
call QuestSetDescription(Quest(this).qQuest, s)
endif
endif
endmethod
public method operator [] takes player p returns string
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.text[\"" + GetPlayerName(p) + "\"]", "Given player is a neutral player")
return ""
endif
return Quest(this).sText[id]
endmethod
endstruct
// Quest Text Color
// ============================================================
private struct OperatorTextColor extends array
public method operator []= takes player p, ARGB color returns nothing
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.textcolor[\"" + GetPlayerName(p) + "\"]" , "Given player is a neutral player")
return
endif
set Quest(this).aTextColor[id] = color
if GetLocalPlayer() == p then
if Quest(this).bTextColorize[id] then
call QuestSetDescription(Quest(this).qQuest, color.str(Quest(this).sText[id]))
else
call QuestSetDescription(Quest(this).qQuest, Quest(this).sText[id])
endif
endif
endmethod
public method operator [] takes player p returns ARGB
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.textcolor[\"" + GetPlayerName(p) + "\"]", "Given player is a neutral player")
return 0
endif
return Quest(this).aTextColor[id]
endmethod
endstruct
// Quest Text Colorizing
// ============================================================
private struct OperatorTextColorize extends array
public method operator []= takes player p, boolean b returns nothing
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.textcolorize[\"" + GetPlayerName(p) + "\"]=" + B2S(b), "Given player is a neutral player")
return
endif
set Quest(this).bTextColorize[id] = b
if GetLocalPlayer() == p then
if b then
call QuestSetDescription(Quest(this).qQuest, Quest(this).aTextColor[id].str(Quest(this).sText[id]))
else
call QuestSetDescription(Quest(this).qQuest, Quest(this).sText[id])
endif
endif
endmethod
public method operator [] takes player p returns boolean
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.textcolorize[\"" + GetPlayerName(p) + "\"]", "Given player is a neutral player")
return false
endif
return Quest(this).bTextColorize[id]
endmethod
endstruct
// Quest Title Colorizing
// ============================================================
private struct OperatorTitleColorize extends array
public method operator []= takes player p, boolean b returns nothing
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("Quest.titlecolorize[\"" + GetPlayerName(p) + "\"]=" + B2S(b), "Given player is a neutral player")
return
endif
set Quest(this).bTitleColorize[id] = b
if GetLocalPlayer() == p then
if b then
call QuestSetTitle(Quest(this).qQuest, Quest(this).aTitleColor[id].str(Quest(this).sTitle[id]))
else
call QuestSetTitle(Quest(this).qQuest, Quest(this).sTitle[id])
endif
endif
endmethod
public method operator [] takes player p returns boolean
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("QuestItem.titlecolorize[\"" + GetPlayerName(p) + "\"]", "Given player is a neutral player")
return false
endif
return Quest(this).bTitleColorize[id]
endmethod
endstruct
//==================
// Quest Item Text
// ============================================================
private struct OperatorItemText extends array
public method operator []= takes player p, string s returns nothing
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("QuestItem.text[\"" + GetPlayerName(p) + "\"]=" + s, "Given player is a neutral player")
return
endif
set QuestItem(this).sText[id] = s
if QuestItem(this).bColorize[id] then
if GetLocalPlayer() == p then
call QuestItemSetDescription(QuestItem(this).qItem, QuestItem(this).aColor[id].str(s))
endif
else
if GetLocalPlayer() == p then
call QuestItemSetDescription(QuestItem(this).qItem, s)
endif
endif
endmethod
public method operator [] takes player p returns string
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("QuestItem.text[\"" + GetPlayerName(p) + "\"]", "Given player is a neutral player")
return ""
endif
return QuestItem(this).sText[id]
endmethod
endstruct
// Quest Item Text Color
// ============================================================
private struct OperatorItemColor extends array
public method operator []= takes player p, ARGB color returns nothing
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("QuestItem.color[\"" + GetPlayerName(p) + "\"]", "Given player is a neutral player")
return
endif
set QuestItem(this).aColor[id] = color
if QuestItem(this).bColorize[id] then
if GetLocalPlayer() == p then
call QuestItemSetDescription(QuestItem(this).qItem, color.str(QuestItem(this).sText[id]))
endif
endif
endmethod
public method operator [] takes player p returns ARGB
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("QuestItem.color[\"" + GetPlayerName(p) + "\"]", "Given player is a neutral player")
return 0
endif
return QuestItem(this).aColor[id]
endmethod
endstruct
// Quest Item Data
// ============================================================
private struct OperatorItemData extends array
public method operator []= takes player p, integer data returns nothing
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("QuestItem.data[\"" + GetPlayerName(p) + "\"]=" + I2S(data), "Given player is a neutral player")
return
endif
set QuestItem(this).iData[id] = data
endmethod
public method operator [] takes player p returns integer
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("QuestItem.data[\"" + GetPlayerName(p) + "\"]", "Given player is a neutral player")
return 0
endif
return QuestItem(this).iData[id]
endmethod
endstruct
// Quest Item Completed
// ============================================================
private struct OperatorItemCompleted extends array
public method operator []= takes player p, boolean b returns nothing
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("QuestItem.completed[\"" + GetPlayerName(p) + "\"]=" + B2S(b), "Given player is a neutral player")
return
endif
set QuestItem(this).bCompleted[id] = b
if GetLocalPlayer() == p then
call QuestItemSetCompleted(QuestItem(this).qItem, b)
endif
endmethod
public method operator [] takes player p returns boolean
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("QuestItem.completed[\"" + GetPlayerName(p) + "\"]", "Given player is a neutral player")
return false
endif
return QuestItem(this).bCompleted[id]
endmethod
endstruct
// Quest Item Text Colorize
// ============================================================
private struct OperatorItemColorize extends array
public method operator []= takes player p, boolean b returns nothing
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("QuestItem.colorize[\"" + GetPlayerName(p) + "\"]=" + B2S(b), "Given player is a neutral player")
return
endif
set QuestItem(this).bColorize[id] = b
if GetLocalPlayer() == p then
if b then
call QuestItemSetDescription(QuestItem(this).qItem, QuestItem(this).aColor[id].str(QuestItem(this).sText[id]))
else
call QuestItemSetDescription(QuestItem(this).qItem, QuestItem(this).sText[id])
endif
endif
endmethod
public method operator [] takes player p returns boolean
local integer id = GetPlayerId(p)
if id > 11 then
debug call ErrorMsg("QuestItem.colorize[\"" + GetPlayerName(p) + "\"]", "Given player is a neutral player")
return false
endif
return QuestItem(this).bColorize[id]
endmethod
endstruct
// ============================================================
// QuestItem Struct
// ============================================================
struct QuestItem
readonly questitem qItem
Quest qOwner
ARGB array aColor[12] //0xFFFFFF
boolean array bCompleted[12] //false
boolean array bColorize[12] //true
integer array iData[12] //0
string array sText[12] //""
static method create takes Quest q returns thistype
local thistype this
local integer i = 0
if q.qItemId > MAX_QUESTITEMS-1 then
return 0
endif
set this = .allocate()
set .qItem = QuestCreateItem(q.qQuest)
set q.qItem[q.qItemId] = this
set q.qItemId = q.qItemId + 1
set .qOwner = q
loop
exitwhen i >= 12
set .iData<i> = 0
set .bColorize<i> = true
set .bCompleted<i> = false
set .aColor<i> = 0xFFFFFF
set i = i + 1
endloop
return this
endmethod
method duplicate takes Quest q returns thistype
local thistype it
local integer i = 0
if q.qItemId > MAX_QUESTITEMS then
return 0
endif
set it = .allocate()
set it.qItem = QuestCreateItem(q.qQuest)
set q.qItem[q.qItemId] = it
set q.qItemId = q.qItemId + 1
set it.qOwner = q
loop
exitwhen i >= 12
set it.iData<i> = .iData<i>
set it.bColorize<i> = .bColorize<i>
set it.bCompleted<i> = .bCompleted<i>
set it.aColor<i> = .aColor<i>
set it.sText<i> = .sText<i>
if GetLocalPlayer() == Player(i) then
call QuestItemSetCompleted(it.qItem, .bCompleted<i>)
if .bColorize<i> then
call QuestItemSetDescription(it.qItem, .aColor<i>.str(.sText<i>))
else
call QuestItemSetDescription(it.qItem, .sText<i>)
endif
endif
set i = i + 1
endloop
return it
endmethod
private method onDestroy takes nothing returns nothing
set .qItem = null
endmethod
//==================
public method operator completed takes nothing returns OperatorItemCompleted
return OperatorItemCompleted(this)
endmethod
public method operator data takes nothing returns OperatorItemData
return OperatorItemData(this)
endmethod
public method operator text takes nothing returns OperatorItemText
return OperatorItemText(this)
endmethod
public method operator color takes nothing returns OperatorItemColor
return OperatorItemColor(this)
endmethod
public method operator colorize takes nothing returns OperatorItemColorize
return OperatorItemColorize(this)
endmethod
//==================
public method operator data= takes integer value returns nothing
local integer i = 0
loop
exitwhen i == 12
set .iData<i> = value
set i = i + 1
endloop
endmethod
public method operator text= takes string value returns nothing
local integer i = 0
loop
exitwhen i == 12
set .sText<i> = value
if GetLocalPlayer() == Player(i) then
if .bColorize<i> then
call QuestItemSetDescription(.qItem, .aColor<i>.str(value))
else
call QuestItemSetDescription(.qItem, value)
endif
endif
set i = i + 1
endloop
endmethod
public method operator color= takes ARGB color returns nothing
local integer i = 0
loop
exitwhen i == 12
set .aColor<i> = color
if .bColorize<i> then
if GetLocalPlayer() == Player(i) then
call QuestItemSetDescription(.qItem, color.str(.sText<i>))
endif
endif
set i = i + 1
endloop
endmethod
public method operator completed= takes boolean b returns nothing
local integer i = 0
loop
exitwhen i == 12
set .bCompleted<i> = b
set i = i + 1
endloop
call QuestItemSetCompleted(.qItem, b)
endmethod
public method operator colorize= takes boolean b returns nothing
local integer i = 0
loop
exitwhen i == 12
set .bColorize<i> = b
if b then
if GetLocalPlayer() == Player(i) then
call QuestItemSetDescription(.qItem, .aColor<i>.str(.sText<i>))
endif
else
call QuestItemSetDescription(.qItem, .sText<i>)
endif
set i = i + 1
endloop
endmethod
endstruct
// ============================================================
// Quest Struct
// ============================================================
struct Quest
readonly quest qQuest
QuestItem array qItem[MAX_QUESTITEMS]
integer qItemId = 0
ARGB array aTitleColor[12] //0xFFFFFF
ARGB array aTextColor[12] //0xFFFFFF
boolean array bVisible[12] //true
boolean array bRequired[12] //true
boolean array bDiscovered[12] //true
boolean array bFailed[12] //false
boolean array bCompleted[12] //false
boolean array bTitleColorize[12] //true
boolean array bTextColorize[12] //true
integer array iData[12] //0
string array sTitle[12] //""
string array sIcon[12] //""
string array sText[12] //""
static method create takes nothing returns thistype
local thistype this = .allocate()
local integer i = 0
set .qQuest = CreateQuest()
loop
exitwhen i >= 12
set .iData<i> = 0
set .aTitleColor<i> = 0xFFFFFF
set .aTextColor<i> = 0xFFFFFF
set .bVisible<i> = true
set .bTitleColorize<i> = true
set .bTextColorize<i> = true
set .bRequired<i> = true
set .bDiscovered<i> = true
set .bFailed<i> = false
set .bCompleted<i> = false
set i = i + 1
endloop
return this
endmethod
method duplicate takes nothing returns thistype
local thistype new = .allocate()
local integer i = 0
set new.qQuest = CreateQuest()
loop
exitwhen i >= 12
set new.aTitleColor<i> = .aTitleColor<i>
set new.aTextColor<i> = .aTextColor<i>
set new.bVisible<i> = .bVisible<i>
set new.bRequired<i> = .bRequired<i>
set new.bDiscovered<i> = .bDiscovered<i>
set new.bFailed<i> = .bFailed<i>
set new.bCompleted<i> = .bCompleted<i>
set new.bTitleColorize<i> = .bTitleColorize<i>
set new.bTextColorize<i> = .bTextColorize<i>
set new.iData<i> = .iData<i>
set new.sTitle<i> = .sTitle<i>
set new.sIcon<i> = .sIcon<i>
set new.sText<i> = .sText<i>
if GetLocalPlayer() == Player(i) then
if .bTextColorize<i> then
call QuestSetDescription(new.qQuest, .aTextColor<i>.str(.sText<i>))
else
call QuestSetDescription(new.qQuest, .sText<i>)
endif
if .bTitleColorize<i> then
call QuestSetTitle(new.qQuest, .aTitleColor<i>.str(.sTitle<i>))
else
call QuestSetTitle(new.qQuest, .sTitle<i>)
endif
call QuestSetIconPath(new.qQuest, .sIcon<i>)
call QuestSetRequired(new.qQuest, .bRequired<i>)
call QuestSetDiscovered(new.qQuest, .bDiscovered<i>)
call QuestSetCompleted(new.qQuest, .bCompleted<i>)
call QuestSetFailed(new.qQuest, .bFailed<i>)
call QuestSetEnabled(new.qQuest, .bVisible<i>)
endif
set i = i + 1
endloop
set i = 0
loop
exitwhen i == .qItemId
call .qItem<i>.duplicate(new)
set i = i + 1
endloop
return new
endmethod
private method onDestroy takes nothing returns nothing
local integer i = 0
call DestroyQuest(.qQuest)
set .qQuest = null
loop
exitwhen i == qItemId
call qItem<i>.destroy()
set i = i + 1
endloop
endmethod
//==================
public method operator visible takes nothing returns OperatorVisible
return OperatorVisible(this)
endmethod
public method operator required takes nothing returns OperatorRequired
return OperatorRequired(this)
endmethod
public method operator failed takes nothing returns OperatorFailed
return OperatorFailed(this)
endmethod
public method operator completed takes nothing returns OperatorCompleted
return OperatorCompleted(this)
endmethod
public method operator discovered takes nothing returns OperatorDiscovered
return OperatorDiscovered(this)
endmethod
public method operator data takes nothing returns OperatorData
return OperatorData(this)
endmethod
public method operator icon takes nothing returns OperatorIcon
return OperatorIcon(this)
endmethod
public method operator title takes nothing returns OperatorTitle
return OperatorTitle(this)
endmethod
public method operator titleColor takes nothing returns OperatorTitleColor
return OperatorTitleColor(this)
endmethod
public method operator titleColorize takes nothing returns OperatorTitleColorize
return OperatorTitleColorize(this)
endmethod
public method operator text takes nothing returns OperatorText
return OperatorText(this)
endmethod
public method operator textColor takes nothing returns OperatorTextColor
return OperatorTextColor(this)
endmethod
public method operator textColorize takes nothing returns OperatorTextColorize
return OperatorTextColorize(this)
endmethod
//==================
public method operator data= takes integer value returns nothing
local integer i = 0
loop
exitwhen i == 12
set .iData<i> = value
set i = i + 1
endloop
endmethod
public method operator text= takes string value returns nothing
local integer i = 0
loop
exitwhen i == 12
set .sText<i> = value
if GetLocalPlayer() == Player(i) then
if .bTextColorize<i> then
call QuestSetDescription(.qQuest, .aTextColor<i>.str(value))
else
call QuestSetDescription(.qQuest, value)
endif
endif
set i = i + 1
endloop
endmethod
public method operator textColor= takes ARGB color returns nothing
local integer i = 0
loop
exitwhen i == 12
set .aTextColor<i> = color
if GetLocalPlayer() == Player(i) then
if .bTextColorize<i> then
call QuestSetDescription(.qQuest, color.str(.sText<i>))
else
call QuestSetDescription(.qQuest, .sText<i>)
endif
endif
set i = i + 1
endloop
endmethod
public method operator title= takes string value returns nothing
local integer i = 0
loop
exitwhen i == 12
set .sTitle<i> = value
if GetLocalPlayer() == Player(i) then
if .bTitleColorize<i> then
call QuestSetTitle(.qQuest, .aTitleColor<i>.str(value))
else
call QuestSetTitle(.qQuest, value)
endif
endif
set i = i + 1
endloop
endmethod
public method operator icon= takes string s returns nothing
local integer i = 0
loop
exitwhen i == 12
set .sIcon<i> = s
set i = i + 1
endloop
call QuestSetIconPath(.qQuest, s)
endmethod
public method operator titleColor= takes ARGB color returns nothing
local integer i = 0
loop
exitwhen i == 12
set .aTitleColor<i> = color
if GetLocalPlayer() == Player(i) then
if .bTitleColorize<i> then
call QuestSetTitle(.qQuest, color.str(.sTitle<i>))
else
call QuestSetTitle(.qQuest, .sTitle<i>)
endif
endif
set i = i + 1
endloop
endmethod
public method operator required= takes boolean b returns nothing
local integer i = 0
loop
exitwhen i == 12
set .bRequired<i> = b
set i = i + 1
endloop
call QuestSetRequired(.qQuest, b)
endmethod
public method operator discovered= takes boolean b returns nothing
local integer i = 0
loop
exitwhen i == 12
set .bDiscovered<i> = b
set i = i + 1
endloop
call QuestSetDiscovered(.qQuest, b)
endmethod
public method operator completed= takes boolean b returns nothing
local integer i = 0
loop
exitwhen i == 12
set .bCompleted<i> = b
set i = i + 1
endloop
call QuestSetCompleted(.qQuest, b)
endmethod
public method operator failed= takes boolean b returns nothing
local integer i = 0
loop
exitwhen i == 12
set .bFailed<i> = b
set i = i + 1
endloop
call QuestSetFailed(.qQuest, b)
endmethod
public method operator visible= takes boolean b returns nothing
local integer i = 0
loop
exitwhen i == 12
set .bVisible<i> = b
set i = i + 1
endloop
call QuestSetEnabled(.qQuest, b)
endmethod
public method operator textColorize= takes boolean b returns nothing
local integer i = 0
loop
exitwhen i == 12
set .bTextColorize<i> = b
if b then
if GetLocalPlayer() == Player(i) then
call QuestSetDescription(.qQuest, .aTextColor<i>.str(.sText<i>))
endif
else
call QuestSetDescription(.qQuest, .sText<i>)
endif
set i = i + 1
endloop
endmethod
public method operator titleColorize= takes boolean b returns nothing
local integer i = 0
loop
exitwhen i == 12
set .bTitleColorize<i> = b
if b then
if GetLocalPlayer() == Player(i) then
call QuestSetTitle(.qQuest, .aTitleColor<i>.str(.sTitle<i>))
endif
else
call QuestSetTitle(.qQuest, .sTitle<i>)
endif
set i = i + 1
endloop
endmethod
endstruct
endlibrary</i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i>
The test map contains a simple quest to show how do the system works.
Changelog:
1.0.0 >> 12.08.2010
-First release
1.0.1 >> 12.09.2010
-Minor bug & logical fail fixes
-New Quest.duplicate() method
1.0.2 >> 12.09.2010.
-Runtime speed improvements
Please tell me your opinion and suggestions, and let me know if you found a bug.