annotate items.pas @ 0:62966dd383ed default tip

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