blob: ca0d9c6fe1fdd10bc839aeb8ce06c049f05de6af [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// clothing/container_description.c -- clothing_container description handling
4//
5// $Id: container_description.c 6198 2007-02-13 23:39:43Z Zesstra $
6
7#pragma strict_types
8#pragma save_types
9#pragma no_clone
MG Mud User88f12472016-06-24 23:31:02 +020010#pragma range_check
11
12inherit "/std/thing/description";
13
14#define NEED_PROTOTYPES
15
16#include <thing/properties.h>
17#include <thing/description.h>
18#include <thing/language.h>
19#include <container.h>
20#include <combat.h>
21#include <thing/material.h>
22#include <defines.h>
23#include <wizlevels.h>
24#include <player/base.h>
25
26void create()
27{
28 ::create();
29 SetProp(P_TRANSPARENT, 1);
30 AddId("Container");
31}
32
33string dam_descr()
34{ string re;
35 mixed desc;
36 int maximum,dam,pos;
37
38 if (!QueryProp(P_NAME) || !QueryProp(P_DAMAGED) || !QueryProp(P_SHORT) ||
39 !(desc=QueryProp(P_DAM_DESC)) || (!stringp(desc) && !pointerp(desc)))
40 return "";
41 re = capitalize(name(WER,2))+" ";
42 maximum = QueryProp(P_AC)+(dam=QueryProp(P_DAMAGED));
43 if (stringp(desc))
44 return (dam>(maximum/2))?(re+desc+".\n"):"";
45 pos = (sizeof(desc)*dam/maximum);
46 if (stringp(desc[pos]))
47 return (re+desc[pos]+".\n");
48 return "";
49}
50
51string short()
52{ string s;
53 if(!(s=process_string(QueryProp(P_SHORT))))
54 return 0;
55 return s+(QueryProp(P_WORN)?" (angezogen).\n":".\n");
56}
57
58varargs string long(int mode)
59{ string descr, inv_descr;
60
61 descr=(process_string(QueryProp(P_LONG)||"") + (dam_descr()||""));
62 if (!QueryProp(P_TRANSPARENT))
63 return descr;
64
65 inv_descr = make_invlist(PL, all_inventory(ME), mode );
66 if ( inv_descr != "" )
67 descr += capitalize(QueryPronoun(WER)) + " enthaelt:\n" + inv_descr;
68 return descr;
69}
70
71mapping _query_material() {
72 mixed res,at;
73
74 if (mappingp(res=Query(P_MATERIAL)))
75 return res;
76 at=QueryProp(P_ARMOUR_TYPE);
77 switch(at) {
78 case AT_ARMOUR:
79 case AT_HELMET:
80 case AT_RING:
81 case AT_AMULET:
82 case AT_SHIELD:
83 return ([MAT_MISC_METAL:100]);
84 case AT_CLOAK:
85 case AT_TROUSERS:
86 return ([MAT_CLOTH:100]);
87 case AT_GLOVE:
88 case AT_BOOT:
89 return ([MAT_CLOTH:100]);
90 }
91 return ([MAT_CLOTH:100]);
92}
93
94// flags: 1 - wizard, 2 - don't collect equal objects '
95// flags: 4 - don't append infos for wizards
96private void stringenize(mixed obj, int flags, mixed objs, mixed info)
97{
98 string id, tmp;
99 int idx;
100 tmp = capitalize(obj->short()||"")[0..<2]
101 + (!(flags & 4) && (flags & 1) ? " ["+object_name(obj)+"]" : "");
102 if(flags & 3 || living(obj)) id = object_name(obj);
103 else
104 id = explode(object_name(obj), "#")[0] + tmp;
105 if((idx = member(objs, id)) == -1)
106 {
107 objs += ({ id });
108 info += ({ ({ tmp, 1, obj}) });
109 }
110 else
111 info[idx][1]++;
112}
113
114private string collect(mixed obj)
115{
116 if(!sizeof(obj[0])) return 0;
117 return obj[0] + (obj[1] > 1 ? " ("+obj[1]+")" : "");
118}
119
120// flags: 1 - return array, 2 - don't collect equal objects '
121// flags: 4 - don't append infos for wizards
122varargs mixed make_invlist(object viewer, mixed inv, int flags)
123{
124 int iswiz;
125 mixed objs, info;
126 string descr;
127
128 iswiz = IS_LEARNER( viewer ) && viewer->QueryProp(P_WANTS_TO_LEARN);
129 descr = ""; objs = ({}); info = ({});
130 map(inv, #'stringenize/*'*/, iswiz | (flags & 2) | (flags & 4), &objs, &info);
131 if(flags & 1) return info;
132 inv = map(info, #'collect/*'*/) - ({ 0 });
133 if(!sizeof(inv)) return "";
134 return sprintf("%"+(sizeof(inv) > 6 ? "#" : "=")+"-78s",
135 implode(inv, "\n")) + "\n";
136}