0
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
1 { Items handling routines. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
2
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
3 UNIT Items;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
4
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
5 INTERFACE
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
6
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
7 USES Global;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
8
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
9 FUNCTION GetItemWeight(what: ItemSlot): INTEGER; { Counts the weight of an item. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
10 FUNCTION IsInThere(what,where: ItemSlot):BOOLEAN; { Checks if item WHAT is somwhere inside item WHERE. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
11 PROCEDURE GetItemLooks(VAR a:BYTE;VAR c:CHAR;what:ItemSlot); { Sets A and C to fit items looks. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
12 FUNCTION GetItemDesc(what: ItemSlot): STRING; { Returns item description. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
13 FUNCTION ItemName(what: ItemSlot): STRING; { Returns the name of an item. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
14 PROCEDURE ShowItem(what: ItemSlot); { Tells what kind of item is there. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
15
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
16 FUNCTION GenerateItem(id:BYTE):pItem; { Creates a new item from definitions. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
17 PROCEDURE DestroyItem(what: ItemSlot); { Destroys an item. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
18 PROCEDURE MoveInto(what,where: ItemSlot); { Tries to put item from WHAT into container in slot WHERE. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
19 PROCEDURE MoveItem(what,where: ItemSlot); { Tries to put item from WHAT into slot WHERE. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
20 PROCEDURE DropItem(what,where: ItemSlot); { Drops item from WHAT into slot WHERE, creating a pile if needed. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
21 PROCEDURE PutToPack(what: ItemSlot); { Tries to put an item into pack. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
22
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
23 FUNCTION ListItems(where: ItemSlot):ItemSlot; { Lists all items in the container and picks one. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
24 PROCEDURE SelectItem(what: ItemSlot); { Shows item description,asks for action and performs it. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
25 PROCEDURE CheckPile(where: ItemSlot); { Destroys a pile if itsn't needed anymore. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
26 PROCEDURE ExamInv; { Displays equipment. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
27
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
28 IMPLEMENTATION
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
29
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
30 USES Console;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
31
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
32 TYPE pStack=^StackRec;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
33 StackRec=RECORD
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
34 slt: pItem;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
35 next: pStack;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
36 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
37
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
38 VAR stack: pStack;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
39
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
40 { ------------------------------------------- Item information ---------- }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
41
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
42 PROCEDURE StackPush(what: pItem); { Pushes an item entry on stack. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
43 VAR tmp: pStack;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
44 BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
45 New(tmp);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
46 tmp^.slt:=what;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
47 tmp^.next:=stack;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
48 stack:=tmp;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
49 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
50
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
51 PROCEDURE StackPop(VAR what: pItem); { Pops an item entry from stack. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
52 VAR tmp: pStack;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
53 BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
54 IF stack=NIL THEN Exit;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
55 what:=stack^.slt;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
56 tmp:=stack;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
57 stack:=stack^.next;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
58 Dispose(tmp);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
59 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
60
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
61
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
62 FUNCTION GetItemWeight(what: ItemSlot): INTEGER; { Counts the weight of an item. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
63 VAR weight: INTEGER;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
64 p: pItem;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
65 BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
66 stack:=NIL; { The stack is empty. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
67 weight:=what^^.def^.wgt*what^^.qnt; { Base weight. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
68 StackPush(what^^.con); { Now we search all the tree. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
69 REPEAT
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
70 StackPop(p);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
71 WHILE p<>NIL DO BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
72 Inc(weight,p^.def^.wgt*p^.qnt);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
73 IF p^.con<>NIL THEN StackPush(p^.con);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
74 p:=p^.next;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
75 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
76 UNTIL p=NIL;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
77 GetItemWeight:=weight;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
78 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
79
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
80 FUNCTION IsInThere(what,where: ItemSlot):BOOLEAN; { Checks if item WHAT is somwhere inside item WHERE. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
81 VAR p: pItem;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
82 BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
83 IsInThere:=FALSE;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
84 stack:=NIL;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
85 StackPush(where^);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
86 REPEAT
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
87 StackPop(p);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
88 WHILE p<>NIL DO BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
89 IF p=what^ THEN IsInThere:=TRUE;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
90 IF p^.con<>NIL THEN StackPush(p^.con);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
91 p:=p^.next;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
92 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
93 UNTIL p=NIL;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
94 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
95
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
96 PROCEDURE GetItemLooks(VAR a:BYTE;VAR c:CHAR;what:ItemSlot); { Sets A and C to fit items looks. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
97 VAR tmp: ItemDef;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
98 BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
99 IF (SLOT_KNOWN IN what^^.flg) THEN tmp:=what^^.def
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
100 ELSE tmp:=FindItem(what^^.def^.unk);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
101 c:=tmp^.chr;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
102 a:=tmp^.atr;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
103 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
104
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
105 FUNCTION GetItemDesc(what: ItemSlot): STRING; { Returns item description. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
106 BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
107 IF (SLOT_KNOWN IN what^^.flg)OR(what^^.def^.unk=0) THEN { If item is known -- we return its description. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
108 GetItemDesc:=what^^.def^.dsc
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
109 ELSE GetItemDesc:=FindItem(what^^.def^.unk)^.dsc; { But if not, we return description of item type. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
110 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
111
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
112 FUNCTION ItemName(what: ItemSlot): STRING; { Returns the name of an item. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
113 VAR s: STRING;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
114 BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
115 ItemName:='';
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
116 IF (what^=NIL) THEN BEGIN { If there is nothing, we return 'nothing'. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
117 ItemName:=FindItem(0)^.nam;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
118 Exit;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
119 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
120
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
121 IF (SLOT_KNOWN IN what^^.flg) THEN s:=what^^.def^.nam { If item is known, we return its real name. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
122 ELSE s:=FindItem(what^^.def^.unk)^.nam;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
123
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
124 { When there are many items of the same kind, we tell how many. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
125 IF (ITEM_MULTIPLE IN what^^.def^.flg) AND (what^^.qnt>1) THEN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
126 s:=Replace(Plural(s),'@a',Num(what^^.qnt))
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
127 ELSE BEGIN { Elsewhen we add 'a' or 'an'. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
128 s:=Replace(s,'@a a','an a');
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
129 s:=Replace(s,'@a e','an e');
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
130 s:=Replace(s,'@a i','an i');
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
131 s:=Replace(s,'@a o','an o');
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
132 s:=Replace(s,'@a u','an u');
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
133 s:=Replace(s,'@a ' ,'a ');
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
134 s:=Replace(s,'@a' ,'a');
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
135 s:=Replace(s,'@s','');
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
136 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
137 ItemName:=s;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
138 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
139
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
140 PROCEDURE ShowItem(what: ItemSlot); { Tells what kind of item is there. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
141 BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
142 IF what^=NIL THEN Exit; { If there is nothing -- we won't bother. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
143 Msg(Replace(msgs[13],'@v',ItemName(what)));
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
144 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
145
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
146 { ------------------------------------------- Item moving and creation -- }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
147
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
148 FUNCTION GenerateItem(id:BYTE):pItem; { Creates a new item from definitions. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
149 VAR item: ItemDef;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
150 tmp: pItem;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
151 BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
152 New(tmp); { We make room for item. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
153 item:=FindItem(id); { We find according definitions. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
154 tmp^.def:=item; { We fill in all data necessary. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
155 tmp^.qnt:=item^.qnt+Random(item^.qnt);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
156 tmp^.flg:=[];
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
157 tmp^.con:=NIL;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
158 tmp^.next:=NIL;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
159 IF (ITEM_KNOWN IN item^.flg) THEN tmp^.flg:=tmp^.flg+[SLOT_KNOWN];
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
160 GenerateItem:=tmp; { And we have brand new item. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
161 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
162
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
163 PROCEDURE DestroyItem(what: ItemSlot); { Destroys an item. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
164 VAR tmp: pItem;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
165 BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
166 tmp:=what^; { We take item from any container it may be in. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
167 what^:=tmp^.next; { We update this container's list of items. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
168 Dispose(tmp); { And we relase memory. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
169 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
170
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
171 PROCEDURE MoveInto(what,where: ItemSlot); { Tries to put item from WHAT into container in slot WHERE. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
172 VAR tmp: pItem;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
173 BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
174 IF IsInThere(where,what) THEN Exit; { We dont want to put something into itself! }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
175 tmp:=what^; { Now, we take item from any container it may be in. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
176 what^:=tmp^.next; { We update this container's list of items. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
177 tmp^.next:=where^^.con; { We put all items from WHERE behind our item. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
178 where^^.con:=tmp; { We put our item into item in slot WHERE. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
179 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
180
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
181 PROCEDURE MoveItem(what,where: ItemSlot); { Tries to put item from WHAT into slot WHERE. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
182 VAR tmp: pItem;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
183 BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
184 IF where^<>NIL THEN Exit; { Is there something already? }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
185 tmp:=what^; { Now, we take item from any container it may be in. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
186 what^:=tmp^.next; { We update this container's list of items. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
187 tmp^.next:=NIL; { Our item is the only one here. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
188 where^:=tmp; { We put our item into slot WHERE. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
189 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
190
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
191 PROCEDURE DropItem(what,where: ItemSlot); { Drops item from WHAT into slot WHERE, creating a pile if needed. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
192 VAR tmp: ItemSlot;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
193 p: pItem;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
194 BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
195 IF where^=NIL THEN BEGIN { If WHERE is empty, we simply put our item there. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
196 MoveItem(what,where);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
197 Exit;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
198 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
199
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
200 IF where^^.def^.id=PILEITEM THEN BEGIN { If there is a pile already, we just add our item to the pile. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
201 MoveInto(what,where)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
202 END ELSE BEGIN { If there is an item already... }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
203 New(tmp); { We need 'third hand'. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
204 tmp^:=NIL;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
205 MoveItem(where,tmp); { We pick the item from the floor. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
206 p:=GenerateItem(PILEITEM); { Then we create a pile... }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
207 MoveItem(@p,where); { And put it on the floor. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
208 MoveInto(tmp,where); { Then we put both items into the pile. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
209 MoveInto(what,where);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
210 Dispose(tmp); { W don't need third hand anymore. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
211 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
212 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
213
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
214 PROCEDURE PutToPack(what: ItemSlot); { Tries to put an item into pack. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
215 BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
216 IF (pc.inv[INV_PACK]=NIL) OR { Have we any pack to put into? }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
217 NOT (ITEM_EMPTY IN pc.inv[INV_PACK]^.def^.flg) THEN Exit;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
218 { We inform the player about what we are doing. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
219 Msg(Replace(Replace(msgs[15],'@1',ItemName(@(pc.inv[INV_PACK]))),'@v',ItemName(what)));
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
220 MoveInto(what,@(pc.inv[INV_PACK])); { And we do it. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
221 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
222
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
223 { ------------------------------------------- Menus and handling -------- }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
224
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
225 PROCEDURE CheckCmd(VAR a:INTEGER;c:CHAR;b:BYTE);{ Checks if key C belong to command B }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
226 BEGIN { and sets A to this command if so. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
227 IF c=cmd[b] THEN a:=b;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
228 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
229
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
230 FUNCTION ListItems(where: ItemSlot):ItemSlot; { Lists all items in the container and picks one. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
231 VAR p,page: ItemSlot;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
232 c,k: CHAR;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
233 BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
234 ListItems:=NIL;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
235 ClrMsg;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
236 p:=@(where^^.con);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
237 REPEAT { Tell what item we are looking into. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
238 Msg(Replace(msgs[29],'@v',ItemName(where)));
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
239
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
240 page:=p; { Mark the top of actual page. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
241 c:='a'; { Show a-p items. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
242 WHILE (p^<>NIL) AND (c<='p') DO BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
243 Msg(Replace(Replace(msgs[30],'@1',c),'@v',ItemName(p)));
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
244 Inc(c);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
245 p:=@(p^^.next);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
246 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
247 { Tell if there is more. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
248 IF (p^<>NIL) THEN Msg(msgs[19]);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
249
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
250 k:=GetKey; { Get players choice. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
251 ClrMsg; { And find this item. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
252 IF (k>='a') AND (k<c) THEN BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
253 p:=page;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
254 c:='a';
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
255 WHILE (c<>k) DO BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
256 Inc(c);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
257 p:=@(p^^.next);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
258 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
259 ListItems:=p;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
260 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
261 IF k<>cmd[CMDMORE] THEN Exit; { If the player picked something -- we finish. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
262 IF p^=NIL THEN p:=@(where^^.con);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
263 UNTIL FALSE; { And if not, we display another page. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
264 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
265
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
266 PROCEDURE SelectItem(what: ItemSlot); { Shows item description,asks for action and performs it. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
267 VAR c: CHAR;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
268 l: INTEGER;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
269 tmp: pItem;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
270 s: STRING;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
271
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
272 AllowLoot, AllowPutInto, AllowHold, AllowDrop, AllowPack: BOOLEAN;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
273 WhereEquip: BYTE;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
274
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
275 BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
276 REPEAT
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
277 IF (what=NIL) OR (what^=NIL) OR { We won't select an empty item nor pile. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
278 (what^^.def^.id=PILEITEM) THEN BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
279 Msg(msgs[10]);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
280 Exit;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
281 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
282
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
283 ClrMsg;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
284 Msg(Replace(msgs[17],'@v',ItemName(what))); { We show item's name and description. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
285 {IF (ITEM_KNOWN IN what^^.flg) THEN}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
286 Msg(GetItemDesc(what));
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
287
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
288 l:=GetItemWeight(what); { We display item's weight. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
289 IF l=1 THEN s:=Replace(msgs[33],'@s','')
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
290 ELSE s:=Plural(msgs[33]);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
291 Msg(Replace(s,'@v',Num(l)));
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
292
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
293 AllowHold:=FALSE; { Now we determine what actions can be performed. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
294 AllowPutInto:=FALSE;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
295 AllowLoot:=FALSE;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
296 AllowDrop:=FALSE;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
297 AllowPack:=FALSE;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
298 WhereEquip:=0;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
299
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
300 IF (pc.inv[INV_PACK]<>NIL)AND { If we have pack and the item we have selected isn't that pack, }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
301 (ITEM_EMPTY IN pc.inv[INV_PACK]^.def^.flg)AND{we can put our item into pack. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
302 NOT(IsInThere(what,@(pc.inv[INV_PACK])))AND
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
303 (pc.inv[INV_PACK]<>what^) THEN AllowPack:=TRUE;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
304
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
305 IF pc.inv[INV_HELD]=NIL THEN AllowHold:=TRUE; { If the player character is empty handed, we can hold something. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
306
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
307 IF (pc.inv[INV_HELD]<>NIL)AND { If the player holds something, and selected item is a container,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
308 { he can put held item in. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
309 NOT(IsInThere(what,@(pc.inv[INV_HELD])))AND { But we have to make sure he won't put it into itself! }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
310 (ITEM_EMPTY IN what^^.def^.flg) THEN AllowPutInto:=TRUE;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
311
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
312 IF (what^^.con<>NIL) THEN AllowLoot:=TRUE; { If it isn't empty, we can loot it. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
313
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
314 { Dropping only when the item isn't on floor already. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
315 IF NOT(IsInThere(what,@(GetMap(playchr^.x,playchr^.y)^.slt))) THEN AllowDrop:=TRUE;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
316
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
317 WhereEquip:=what^^.def^.eqp; { And we can equip is if it can be equipped. :) }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
318
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
319 IF AllowHold THEN Msg(msgs[41]); { We display action names. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
320 IF AllowPutInto THEN Msg(msgs[42]);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
321 IF WhereEquip>0 THEN Msg(msgs[44]);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
322 IF AllowPack THEN Msg(msgs[45]);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
323 IF AllowLoot THEN Msg(msgs[40]);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
324 IF AllowDrop THEN Msg(msgs[43]);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
325
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
326 l:=CMDNOTHING; { Ask for action. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
327 c:=GetKey;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
328 ClrMsg;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
329 IF AllowPack THEN CheckCmd(l,c,CMDPUTTOPACK);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
330 IF AllowLoot THEN CheckCmd(l,c,CMDLOOT);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
331 IF AllowHold THEN CheckCmd(l,c,CMDUPINAIR);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
332 IF AllowPutInto THEN CheckCmd(l,c,CMDUPINAIR);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
333 IF WhereEquip>0 THEN CheckCmd(l,c,CMDEQUIP);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
334 IF AllowDrop THEN CheckCmd(l,c,CMDDROP);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
335
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
336 CASE l OF { Perform the action. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
337 CMDLOOT: BEGIN { We list items inside and wait allow to select an item. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
338 what:=ListItems(what);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
339 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
340 CMDPUTTOPACK: BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
341 PutToPack(what); { Simple. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
342 what:=NIL; { We don't want to select this item again. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
343 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
344 CMDUPINAIR: IF AllowHold THEN BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
345 MoveItem(what,@(pc.inv[INV_HELD]));
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
346 what:=NIL;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
347 END ELSE IF AllowPutInto THEN BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
348 MoveInto(@(pc.inv[INV_HELD]),what);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
349 Msg(Replace(Replace(msgs[15],'@1',ItemName(what)) ,'@v',ItemName(@(pc.inv[INV_HELD]))));
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
350 what:=NIL;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
351 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
352 CMDDROP:BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
353 DropItem(what,@(GetMap(playchr^.x,playchr^.y)^.slt));
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
354 ShowItem(@(GetMap(playchr^.x,playchr^.y)^.slt));
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
355 what:=NIL;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
356 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
357 CMDEQUIP:BEGIN { If there is an item equipped and player character is empty handed, we hold equipped item. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
358 IF pc.inv[WhereEquip]<>NIL THEN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
359 IF pc.inv[INV_HELD]=NIL THEN MoveItem(@(pc.inv[WhereEquip]),@(pc.inv[INV_HELD]));
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
360
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
361 { If the slot is free, we equip selected item. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
362 IF pc.inv[WhereEquip]=NIL THEN MoveItem(what,@(pc.inv[WhereEquip]))
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
363 ELSE Msg(msgs[32]);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
364 what:=NIL;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
365 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
366 CMDNOTHING:BEGIN { If no action, we cancel selection. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
367 Msg(msgs[10]);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
368 what:=NIL;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
369 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
370 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
371 UNTIL what=NIL; { If the player haven't selected another item, we finish. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
372 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
373
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
374 PROCEDURE CheckPile(where: ItemSlot); { Destroys a pile if itsn't needed anymore. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
375 VAR tmp: ItemSlot;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
376 BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
377 IF where^=NIL THEN Exit; { If there is nothing there, we finish. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
378 IF where^^.def^.id<>PILEITEM THEN Exit; { If there is no pile, we finish too. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
379
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
380 IF where^^.con=NIL THEN BEGIN { If the pile is empty, we simply destroy it. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
381 DestroyItem(where);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
382 Exit;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
383 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
384 IF (where^^.con^.next=NIL) THEN BEGIN { If there is only one item in the pile.. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
385 New(tmp); { We need 'third hand'. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
386 tmp^:=NIL;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
387 MoveItem(@(where^^.con),tmp); { We take the item out of pile. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
388 DestroyItem(where); { We destroy the pile. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
389 MoveItem(tmp,where); { Then we put the item on the floor. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
390 Dispose(tmp); { We don't need third hand. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
391 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
392 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
393
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
394 PROCEDURE ExamInv; { Displays equipment. }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
395 VAR c:CHAR;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
396 BEGIN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
397 ClrMsg;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
398 Msg(Concat('@Ma@m)HELD: @M',ItemName(@(pc.inv[INV_HELD]))));
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
399 Msg(Concat('@Mb@m)PACK: @M',ItemName(@(pc.inv[INV_PACK]))));
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
400 Msg(Concat('@Mc@m)WEAR: @M',ItemName(@(pc.inv[INV_WEAR]))));
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
401 c:=GetKey;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
402 ClrMsg;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
403 CASE c OF
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
404 'a': SelectItem(@pc.inv[INV_HELD]);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
405 'b': SelectItem(@pc.inv[INV_PACK]);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
406 'c': SelectItem(@pc.inv[INV_WEAR]);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
407 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
408 END;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
409
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
410 END. |