• Listen to a special audio message from Bill Roper to the Hive Workshop community (Bill is a former Vice President of Blizzard Entertainment, Producer, Designer, Musician, Voice Actor) 🔗Click here to hear his message!
  • Read Evilhog's interview with Gregory Alper, the original composer of the music for WarCraft: Orcs & Humans 🔗Click here to read the full interview.

[Vjass]

Status
Not open for further replies.
Level 4
Joined
Jan 11, 2008
Messages
55
Im making a advanced system, where you can change a heros ability sets by using a multiboard. However, when I set the icons in the loop, it changes the icons for the whole column.(Btw, its based off final fantasy 13's class system)

JASS:
library paradigm initializer onInit
globals
constant integer ParadigmId = 'A000'

trigger onCast 
classstats array CharClasses
integer totalclasses = 0
multiboard array paradigmboard

endglobals
struct classstats
    integer ability1 = 0
    integer ability2 = 0
    integer ability3 = 0
    integer ability4 = 0
    integer ability5 = 0
    integer ability6 = 0
   integer ability7 = 0    
    string classname =""
    string classdesc1= ""
    string icon = ""
endstruct

function parsedescription takes multiboard m, string S returns nothing
local integer currentline = 0
local integer currentspace = 0
local integer maxcharsperline = 30
local integer stringlength = 0
local string firstline = ""

local string secondline =""

local boolean newline = false
call BJDebugMsg("Initiating text parse prestringlength")
set stringlength = StringLength(S)
call BJDebugMsg("Initiating text parse post string length")
call BJDebugMsg("Description" + S)

if stringlength >= maxcharsperline then
    set newline = true
else 
    set newline = false    
endif

if newline == true then
    set secondline = SubString(S,31,60)
    set firstline = SubString(S,0,30)
    call MultiboardSetItemValue(MultiboardGetItem(m,0,1), firstline)
    call MultiboardSetItemValue(MultiboardGetItem(m,1,1), secondline)
    call BJDebugMsg("two lines")
else
    call BJDebugMsg("One line only")
    set firstline = SubString(S,0,30)
    call MultiboardSetItemValue(MultiboardGetItem(m,0,0), firstline)
endif


endfunction

function AddClass takes string icon ,string name, string desc, integer Abil1, integer Abil2, integer Abil3, integer Abil4, integer Abil5, integer Abil6, integer Abil7 returns nothing
local integer i

set i = totalclasses
set CharClasses[i].ability1 = Abil1
set CharClasses[i].ability2 = Abil2
set CharClasses[i].ability3 = Abil3
set CharClasses[i].ability4 = Abil4
set CharClasses[i].ability5 = Abil5
set CharClasses[i].ability6 = Abil6
set CharClasses[i].ability7 = Abil7

set CharClasses[i].classname = name
set CharClasses[i].classdesc1 = desc
set CharClasses[i].icon = icon
set totalclasses = totalclasses + 1
endfunction

function paraboard takes player p returns nothing
local integer i = 0
local integer i2 =0

local integer imax = totalclasses + 1
call BJDebugMsg("Initializing multiboard")
set paradigmboard[GetPlayerId(p)] = CreateMultiboard()
call MultiboardClear(paradigmboard[GetPlayerId(p)])
call MultiboardSetColumnCount(paradigmboard[GetPlayerId(p)],2)
call MultiboardSetRowCount(paradigmboard[GetPlayerId(p)],imax)
call BJDebugMsg("Multiboard created")
loop
exitwhen i == imax
    call MultiboardSetItemWidth( MultiboardGetItem(paradigmboard[GetPlayerId(p)],i,1),.25)
    call MultiboardSetItemWidth( MultiboardGetItem(paradigmboard[GetPlayerId(p)],i,0),.10)
    call parsedescription(paradigmboard[GetPlayerId(p)], CharClasses[i].classdesc1)
    call MultiboardSetItemIcon(MultiboardGetItem(paradigmboard[GetPlayerId(p)],i ,0), CharClasses[i].icon)
    set i = i+1


endloop


    call BJDebugMsg("Showing board")
    call MultiboardDisplay(paradigmboard[GetPlayerId(p)],true)
    

endfunction



function ParadigmCast takes nothing returns nothing
if GetSpellAbilityId() == ParadigmId then
    call BJDebugMsg("Spell cast")
    call paraboard(GetOwningPlayer(GetSpellAbilityUnit()))
endif
endfunction



private function onInit takes nothing returns nothing
call BJDebugMsg("Init")
set onCast = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(onCast, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction(onCast, function ParadigmCast)
endfunction
endlibrary

JASS:
scope ClassCreation initializer onInit
function onInit takes nothing returns nothing
call AddClass ("ReplaceableTextures\\CommandButtons\\BTNHeroArchMage.blp", "Mage", "Uses ancient magic to deal      damage", 0, 0,0,0,0,0,0)
call AddClass ("ReplaceableTextures\\CommandButtons\\BTNMercenaryCamp.blp", "my rofl copter", "it goes soi soi soi", 0, 0,0,0,0,0,0)

endfunction
endscope

The suspected problem function:

JASS:
function paraboard takes player p returns nothing
local integer i = 0
local integer i2 =0

local integer imax = totalclasses + 1
call BJDebugMsg("Initializing multiboard")
set paradigmboard[GetPlayerId(p)] = CreateMultiboard()
call MultiboardClear(paradigmboard[GetPlayerId(p)])
call MultiboardSetColumnCount(paradigmboard[GetPlayerId(p)],2)
call MultiboardSetRowCount(paradigmboard[GetPlayerId(p)],imax)
call BJDebugMsg("Multiboard created")
loop
exitwhen i == imax
call MultiboardSetItemWidth( MultiboardGetItem(paradigmboard[GetPlayerId(p)],i,1),.25)
call MultiboardSetItemWidth( MultiboardGetItem(paradigmboard[GetPlayerId(p)],i,0),.10)
call parsedescription(paradigmboard[GetPlayerId(p)], CharClasses[i].classdesc1)
call MultiboardSetItemIcon(MultiboardGetItem(paradigmboard[GetPlayerId(p)],i ,0), CharClasses[i].icon)
set i = i+1


endloop
 
Try adding this debug message:
JASS:
function paraboard takes player p returns nothing
    local integer i = 0
    local integer i2 =0
    
    local integer imax = totalclasses + 1
    call BJDebugMsg("Initializing multiboard")
    set paradigmboard[GetPlayerId(p)] = CreateMultiboard()
    call MultiboardClear(paradigmboard[GetPlayerId(p)])
    call MultiboardSetColumnCount(paradigmboard[GetPlayerId(p)],2)
    call MultiboardSetRowCount(paradigmboard[GetPlayerId(p)],imax)
    call BJDebugMsg("Multiboard created")
    call BJDebugMsg(I2S(imax)) //add this
    loop
        exitwhen i == imax
        call MultiboardSetItemWidth( MultiboardGetItem(paradigmboard[GetPlayerId(p)],i,1),.25)
        call MultiboardSetItemWidth( MultiboardGetItem(paradigmboard[GetPlayerId(p)],i,0),.10)
        call parsedescription(paradigmboard[GetPlayerId(p)], CharClasses[i].classdesc1)
        call MultiboardSetItemIcon(MultiboardGetItem(paradigmboard[GetPlayerId(p)],i ,0), CharClasses[i].icon)
        set i = i+1                
    endloop
            
    call BJDebugMsg("Showing board")
    call MultiboardDisplay(paradigmboard[GetPlayerId(p)],true)    
endfunction

This will allow you to see the value of imax. This will then show how many rows of icons it is setting for "Column 0". I assume it must be a high value, since that'd explain why the entire column is being set to the icon.
 
Status
Not open for further replies.
Top