diff --git a/src/shared/xdynrec.pas b/src/shared/xdynrec.pas
index 456a01376f25c8ce60c8aa65236d78cc90ad0927..87aaba0d00fb9ab7dfffbc6c4d5ce0ed51e95457 100644 (file)
--- a/src/shared/xdynrec.pas
+++ b/src/shared/xdynrec.pas
mInternal: Boolean;
mNegBool: Boolean;
mBitSetUnique: Boolean; // bitset can contain only one value
+ mAsMonsterId: Boolean; // special hack for triggers: monster record number+1 in binary (so 0 means "none")
// default value
mDefUnparsed: AnsiString;
mDefSVal: AnsiString; // default string value
mEBSTypeName := '';
mEBSType := nil;
mBitSetUnique := false;
+ mAsMonsterId := false;
mNegBool := false;
mRecRefId := '';
if (mType = TType.TList) then mRVal := TDynRecList.Create();
result.mInternal := mInternal;
result.mNegBool := mNegBool;
result.mBitSetUnique := mBitSetUnique;
+ result.mAsMonsterId := mAsMonsterId;
result.mDefUnparsed := mDefUnparsed;
result.mDefSVal := mDefSVal;
result.mDefIVal := mDefIVal;
TEBS.TEnum: result += ' enum '+mEBSTypeName;
TEBS.TBitSet: begin result += ' bitset '; if mBitSetUnique then result += 'unique '; result += mEBSTypeName; end;
end;
+ if mAsMonsterId then result += ' as monsterid';
if mHasDefault and (Length(mDefUnparsed) > 0) then result += ' default '+mDefUnparsed;
if mSepPosSize then
begin
lmaxdim: Integer;
lebs: TDynField.TEBS;
unique: Boolean;
+ asmonid: Boolean;
begin
fldpasname := '';
fldname := '';
hasdefInt := false;
hasdefId := false;
unique := false;
+ asmonid := false;
lmaxdim := -1;
lebs := TDynField.TEBS.TNone;
else if pr.eatId('wh') then aswh := true
else if pr.eatId('txy') then begin asxy := true; ast := true; end
else if pr.eatId('twh') then begin aswh := true; ast := true; end
+ else if pr.eatId('monsterid') then begin asmonid := true; end
else raise Exception.Create(Format('invalid field ''%s'' as what?', [fldname]));
continue;
end;
self.mEBS := lebs;
self.mEBSTypeName := fldrecname;
self.mBitSetUnique := unique;
+ self.mAsMonsterId := asmonid;
self.mMaxDim := lmaxdim;
self.mBinOfs := fldofs;
self.mRecOfs := fldofs;
begin
f := mOwner.findRecordNumByType(mEBSTypeName, mRecRef);
if (f < 0) then raise Exception.Create(Format('record reference type ''%s'' in field ''%s'' not found in record list', [mEBSTypeName, mName]));
+ if mAsMonsterId then Inc(f);
if (f > maxv) then raise Exception.Create(Format('record reference type ''%s'' in field ''%s'' has too big index', [mEBSTypeName, mName]));
end
else
begin
- f := -1;
+ if mAsMonsterId then f := 0 else f := -1;
end;
case mType of
TType.TByte, TType.TUByte: writeInt(st, Byte(f));
TType.TUInt: f := readLongWord(st);
else raise Exception.Create(Format('invalid non-numeric type ''%s'' for field ''%s'' of record ''%s''', [getTypeName(mType), mName, mEBSTypeName]));
end;
+ if mAsMonsterId then Dec(f);
if (f < 0) then mRecRefId := '' else mRecRefId := Format('%s%d', [mEBSTypeName, f]);
end;
mDefined := true;