Исправим баг на Rune
book
use uo;
use os;
use math;
include "customSpells";
include "include/math";
include "include/client";
include "include/coords";
include "include/canAccess";
const OBJTYPE_RUNE := 0x1f14;
const X1 := 28;
const X2 := 210;
const Y1 := 40;
const Y2 := 115;
const TILE_OFFSET_X := 42;
const TEXT_OFFSET_X := 25;
const TEXT1_OFFSET_Y := 40;
const TEXT2_OFFSET_Y := 20;
const BUTTON_OFFSET_X := 100;
const GATE_OFFSET_Y := 43;
var critical_runes := { 3,5,7,9,11,13,15};
var runecount := 0;
var pagecount := 1;
var layout := {
"page 0",
"gumppic 0 0 2220 ",
"page 1",
"button 55 10 2472 2473 1 0 900",
"text 85 12 0 0 ",
"text 260 12 0 6 ",
"text 85 38 0 1 ",
"text 150 38 0 3 ",
"text 230 38 0 2 ",
"text 333 38 0 4 ",
"gumppic 50 50 57 ",
"gumppic 70 50 58 ",
"gumppic 85 50 58 ",
"gumppic 100 50 58 ",
"gumppic 115 50 58 ",
"gumppic 130 50 58 ",
"gumppic 145 50 58 ",
"gumppic 160 50 59 ",
"gumppic 218 50 57 ",
"gumppic 233 50 58 ",
"gumppic 248 50 58 ",
"gumppic 263 50 58 ",
"gumppic 278 50 58 ",
"gumppic 293 50 58 ",
"gumppic 308 50 58 ",
"gumppic 323 50 59 "
};
var data := {
"Rename Book",
"Charges:",
"Max Charges:",
"",
"",
"Set Default",
""
};
program runebook(who, book)
EraseObjProperty(who, "IsMeditating");
EraseObjProperty(who, "HealTimer");
if(!can_access(who, book))
return;
endif
if(!ReserveItem(book))
return;
endif
var charges := GetObjProperty(book, "charges");
if(!charges)
charges := 0;
SetObjProperty(book,"charges", charges);
endif
var maxcharges := GetObjProperty(book, "maxcharges");
if(!maxcharges)
maxcharges := 5;
SetObjProperty(book,"maxcharges", maxcharges);
endif
data[4] := charges;
data[5] := maxcharges;
var selected_rune_struct;
var ret;
FillInArrays(book);
var result := SendDialogGump( who, layout, data );
if( result[0] == 0 )
return;
elseif(result[0] == 900)
if(book.movable == 0)
SendSysMessage(who, "You cannot do that while the book
is locked down. ");
return;
else
renamebook(who, book);
return;
endif
endif
if(result[0] >= 600)
if(charges < 1)
SendSysMessage(who,"your book is out of charges.");
return;
endif
var d := (result[0] - 600);
var defs := GetObjProperty( book, "runedefs" );
var runeinfo := defs[d];
CreateItemInBackpack(who, 0x0F86);
CreateItemInBackpack(who, 0x0F7B);
CreateItemInBackpack(who, 0x0F7A);
ret := custom_recall(who, runeinfo, book);
charges := GetObjProperty(book,"charges") - 1;
SetObjProperty(book,"charges", charges);
bookname(book);
if( ret == 0 )
SendSysMessage( who, "Recall Failed." );
endif
return;
elseif(result[0] >= 500)
if(book.movable == 0)
SendSysMessage(who, "You cannot do that while the book
is locked down. ");
return;
else
var d := (result[0] - 500);
var defs := GetObjProperty( book, "runedefs" );
var runeinfo := defs[d];
SetObjProperty(book,"x", runeinfo[2]);
SetObjProperty(book,"y", runeinfo[3]);
SetObjProperty(book,"z", runeinfo[4]);
return;
endif
elseif (result[0] >= 81)
if(book.movable == 0)
SendSysMessage(who, "You cannot do that while the book
is locked down. ");
return;
else
var d := (result[0] - 80);
var defs := GetObjProperty( book, "runedefs" );
var runeinfo := defs[d];
if(!runeinfo)
SendSysMessage(who, "That rune no longer exists");
return;
endif
var rune := CreateItemInBackpack(who, 0x1f14);
SetName(rune, runeinfo[1]);
SetObjProperty(rune,"x", runeinfo[2]);
SetObjProperty(rune,"y", runeinfo[3]);
SetObjProperty(rune,"z", runeinfo[4]);
defs.erase(d);
SetObjProperty(book,"runedefs", defs);
return;
endif
endif
var funct := NormalizeReturnValue( result[0] );
var newval := result[0];
if(newval != 1 )
selected_rune_struct := FindThatRune( book, newval);
endif
case (funct)
0: return;
2: if(!ConsumeReagents(who, 32 ))
SendSysMessage(who,"you do not have enough reagents.");
PerformAction(who,ANIM_CAST_DIR);
PlaySoundEffect(who,0x005d);
PlayObjectCenteredEffect(who, 0x3735,0x0a, 0x1e);
return;
endif
CreateItemInBackpack(who, 0x0F86);
CreateItemInBackpack(who, 0x0F7B);
CreateItemInBackpack(who, 0x0F7A);
if(CheckSkill(who, SKILLID_MAGERY, 1, 1))
ret := custom_recall(who, selected_rune_struct, book);
endif
if( ret == 0 )
SendSysMessage(who, "Recall Failed.");
endif
3: if(!ConsumeReagents(who, 52 ))
SendSysMessage(who,"you do not have enough reagents.");
PerformAction(who,ANIM_CAST_DIR);
PlaySoundEffect(who,0x005d);
PlayObjectCenteredEffect(who, 0x3735,0x0a, 0x1e);
return;
endif
ret := custom_gate(who, selected_rune_struct, book);
if( ret == 0 )
SendSysMessage(who, "Gate Failed.");
endif
default:
endcase
endprogram
function bookname(book)
var name := GetObjProperty(book,"name");
if(!name)
name := "a runebook";
endif
var charges := GetObjProperty(book,"charges");
var newname := (name + " [charges: " + charges + "]");
book.name := newname;
endfunction
function renamebook(who, book)
var charges := GetObjProperty(book, "charges");
if(!charges)
charges := 0;
endif
var name := SendTextEntryGump( who, "enter the new name
of the runebook. ", TE_CANCEL_ENABLE, TE_STYLE_NORMAL);
if((!name) || (name == ""))
name := "a runebook";
endif
SetObjProperty(book, "name", name);
bookname(book);
endfunction
function FillInArrays(book)
var r := 1;
var desc;
var i := 5;
var datalen;
var layoutlen;
var line1;
var line2;
var page_rune_num;
var buttonret := 2;
var val := 10;
var runedefs;
if( runedefs != "error" )
layout.append( "page " + CStr(pagecount));
pagecount := pagecount + 1;
layout.append( "button 320 8 2236 2236 0 " +
CStr(pagecount));
runedefs := GetObjProperty( book, "runedefs" );
foreach runed in runedefs
var txt := runed[1];
if( len(txt) <= 12 )
desc := txt;
else
desc := txt[1,12];
endif
if (!desc)
desc := "";
endif
datalen := data.size();
data.append(desc);
case(r)
1: layout.append("text 76 60 0 " + datalen);
layout.append("button 56 62 2118 2117 1 0 " + (r+600));
2: layout.append("text 76 75 0 " + datalen);
layout.append("button 56 77 2118 2117 1 0 " + (r+600));
3: layout.append("text 76 90 0 " + datalen);
layout.append("button 56 92 2118 2117 1 0 " + (r+600));
4: layout.append("text 76 105 0 " + datalen);
layout.append("button 56 107 2118 2117 1 0 " + (r+600));
5: layout.append("text 76 120 0 " + datalen);
layout.append("button 56 122 2118 2117 1 0 " + (r+600));
6: layout.append("text 76 135 0 " + datalen);
layout.append("button 56 137 2118 2117 1 0 " + (r+600));
7: layout.append("text 76 150 0 " + datalen);
layout.append("button 56 152 2118 2117 1 0 " + (r+600));
8: layout.append("text 76 165 0 " + datalen);
layout.append("button 56 167 2118 2117 1 0 " + (r+600));
9: layout.append("text 226 60 0 " + datalen);
layout.append("button 206 62 2118 2117 1 0 " + (r+600));
10: layout.append("text 226 75 0 " + datalen);
layout.append("button 206 77 2118 2117 1 0 " + (r+600));
11: layout.append("text 226 90 0 " + datalen);
layout.append("button 206 92 2118 2117 1 0 " + (r+600));
12: layout.append("text 226 105 0 " + datalen);
layout.append("button 206 107 2118 2117 1 0 " +
(r+600));
13: layout.append("text 226 120 0 " + datalen);
layout.append("button 206 122 2118 2117 1 0 " +
(r+600));
14: layout.append("text 226 135 0 " + datalen);
layout.append("button 206 137 2118 2117 1 0 " +
(r+600));
15: layout.append("text 226 150 0 " + datalen);
layout.append("button 206 152 2118 2117 1 0 " +
(r+600));
16: layout.append("text 226 165 0 " + datalen);
layout.append("button 206 167 2118 2117 1 0 " +
(r+600));
endcase
r := r + 1;
endforeach
layout.append( "page " + CStr(pagecount) );
runedefs := GetObjProperty( book, "runedefs" );
layout.append( "button 50 8 2235 2235 0 " +
CStr(pagecount - 1) );
r := 1;
var counters := 0;
foreach runedef in runedefs
var txt := runedef[1];
runecount := runecount + 1;
datalen := data.size();
layoutlen := layout.size();
var runename := txt;
if (!runename)
runename := "";
endif
var split := SplitWords( runename );
var j;
for( j := 1; j <= 10; j := j + 1 )
if( !split[j] )
split[j] := "";
endif
endfor
if( len(runename) <= 16 )
line1 := runename;
line2 := "";
elseif( (len(split[1]) + len(split[2]) + len(split[3]) +
2) <= 16 )
line1 := split[1] + " " + split[2] + " " + split[3];
line2 := split[4] + " " + split[5];
elseif( len(split[1]) + len(split[2]) + 1 <= 12 )
line1 := split[1] + " " + split[2];
line2 := split[3] + " " + split[4] + " " + split[5];
elseif( len(split[1]) <= 12 )
line1 := split[1];
line2 := split[2] + " " + split[3] + " " + split[4] + "
" + split[5];
endif
data.append(line1);
data.append(line2);
data.append(ToSextant(runedef[2], runedef[3]));
data.append("Drop Rune");
if(runecount in critical_runes)
pagecount := pagecount + 1;
layout.append("page " + (pagecount));
layout.append("button 50 8 2235 2235 0 " +
CStr(pagecount - 1));
endif
page_rune_num := CurrentPageRuneNum( pagecount + 1, i );
case(page_rune_num)
1: layout.append("gumppic 50 40 57 ");
layout.append("gumppic 70 40 58 ");
layout.append("gumppic 85 40 58 ");
layout.append("gumppic 100 40 58 ");
layout.append("gumppic 115 40 58 ");
layout.append("gumppic 130 40 58 ");
layout.append("gumppic 145 40 58 ");
layout.append("gumppic 160 40 59 ");
layout.append("gumppic 218 40 57 ");
layout.append("gumppic 233 40 58 ");
layout.append("gumppic 248 40 58 ");
layout.append("gumppic 263 40 58 ");
layout.append("gumppic 278 40 58 ");
layout.append("gumppic 293 40 58 ");
layout.append("gumppic 308 40 58 ");
layout.append("gumppic 323 40 59 ");
layout.append("text 85 28 0 1 ");
layout.append("text 228 28 0 2 ");
layout.append("text 150 30 0 3 ");
layout.append("text 333 28 0 4 ");
layout.append("button 85 15 2361 2362 1 0 " + (r+ 500)
);
layout.append("button 50 54 2118 2118 1 0 " + (r+ 600)
);
layout.append("button 62 129 2438 2437 1 0 " + (val +
71) );
layout.append("button 65 150 2271 2271 1 0 " + buttonret
);
layout.append("button 125 150 2291 2291 1 0 " +
(buttonret + 1) );
layout.append("text 100 12 0 5 " );
layout.append("text 66 52 0 " + datalen );
layout.append("text 66 72 0 " + CStr(datalen+1));
layout.append("text 60 100 0 " + CStr(datalen+2));
layout.append("text 82 125 0 " + CStr(datalen+3));
buttonret := buttonret + 1;
val := val + 1;
r := r + 1;
2: layout.append("button 220 15 2361 2362 1 0 " + (r+
500) );
layout.append("button 209 54 2118 2118 1 0 " + (r+ 600)
);
layout.append("button 227 129 2438 2437 1 0 " + (val +
71) );
layout.append("button 230 150 2271 2271 1 0 " +
buttonret );
layout.append("button 290 150 2291 2291 1 0 " +
(buttonret + 1) );
layout.append("text 226 52 0 " + datalen );
layout.append("text 226 72 0 " + CStr(datalen+1));
layout.append("text 212 100 0 " + CStr(datalen+2));
layout.append("text 247 125 0 " + CStr(datalen+3));
layout.append("text 235 12 0 5 ");
if((counters + 1) < len(runedefs))
layout.append("button 320 8 2236 2236 0 " +
CStr(pagecount + 1));
endif
layout.append("text 333 28 0 4 ");
buttonret := buttonret + 1;
val := val + 1;
r := r + 1;
endcase
buttonret := buttonret + 1;
counters := counters + 1;
i := i + 1;
endforeach
endif
endfunction
function CurrentPageRuneNum( pagecount, rune_number )
return( rune_number - ( (pagecount-1) * 2));
endfunction
function NormalizeReturnValue( button_num )
if( button_num == 1 )
return 1;
elseif( button_num == 2 )
return 2;
endif
var mod_ret := Mod( button_num, 2);
return (mod_ret + 2);
endfunction
function FindThatRune(book, button_num )
var runedefs := GetObjProperty( book, "runedefs" );
var rune_num := CInt( button_num / 2);
runedefs[rune_num].append(rune_num);
return( runedefs[rune_num]);
endfunction |