blob: 4a3d6f9d3f25e50bbcbca00017a30077c47cb0ff [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// thing/language.c -- language handling object
4//
5// $Id: language.c 8359 2013-02-09 11:43:39Z Zesstra $
6
7#pragma strict_types
8#pragma save_types
9#pragma range_check
10#pragma no_clone
11#pragma pedantic
12
13#include <thing/language.h>
14#include <thing/description.h>
15
16#define NEED_PROTOTYPES
17#include <thing/properties.h>
18
19// Kein create()
20void create()
21{
22 return;
23}
24
25//Inversion, damit Defaultwert von 0 einen Artikel ausgibt
26static int _query_article() { return !Query(P_ARTICLE); }
27
28static int _set_article(int art) { return !Set(P_ARTICLE,!art); }
29
30// Bestimmten Artikel bestimmen
31private string query_c_article(int casus)
32{
33 if (QueryProp(P_PLURAL))
34 return ({ "die ", "der ", "den ", "die "})[casus];
35
36 return ({ ({ "das ", "des ", "dem ", "das " }),
37 ({ "der ", "des ", "dem ", "den " }),
38 ({ "die ", "der ", "der ", "die " }) })
39 [(int)QueryProp(P_GENDER)][casus];
40}
41
42// Ende fuer Artikel und Adjektive
43private varargs string query_g_suffix(int gen, int casus, int anzahl)
44{
45 return ({ ({ ({ "","e"}), ({"es","er"}), ({"em","en"}), ({ "","e"}) }),
46 ({ ({ "","e"}), ({"es","er"}), ({"em","en"}), ({"en","e"}) }),
47 ({ ({"e","e"}), ({"er","er"}), ({"er","en"}), ({ "e","e"}) }) })
48 [gen][casus][anzahl];
49}
50
51// Artikel vorschlagen: gibt es noch mehr Objekte im inv?
52varargs int SuggestArticle(string id)
53{
54 object ob,*obs;
55
56 // Raum oder Master: Bestimmt.
57 if (!environment()) return 1;
58
59 // Keine id? Dann raus
60 if (!id) return 1;
61
62 // Objekt mit gleichem Namen im env? Dann unbestimmt
63 for ( ob=first_inventory(environment()) ; ob ; ob=next_inventory(ob) )
64 if ( ob!=this_object()&& id==(string)ob->QueryProp(P_NAME) )
65 return 0;
66
67 // sonst bestimmt
68 return 1;
69}
70
71// Artikel bestimmen
72varargs string QueryArticle(int casus, int dem, int force)
73{
74 // Kein Artikel
75 if (!force &&!(QueryProp(P_ARTICLE))) return "";
76
77 // Artikelart aussuchen
78 if ( dem==2 ) dem = SuggestArticle(QueryProp(P_NAME));
79
80 // Bestimmter Artikel
81 if (dem) return query_c_article(casus);
82
83 // Unbestimmter Artikel
84 if (QueryProp(P_PLURAL)) return "";
85
86 return sprintf("ein%s ",query_g_suffix((int)QueryProp(P_GENDER),casus));
87}
88
89// Besitzanzeiger fuer Objekt bestimmen
90varargs string QueryOwn(int casus)
91{
92 return sprintf("Dein%s",query_g_suffix(QueryProp(P_GENDER),casus));
93}
94
95// Possessivpronomen bestimmen
96varargs string QueryPossPronoun(mixed what, int casus, int number)
97{
98 int gen2;
99
100 // Geschlecht ermitteln
101 gen2 = (objectp(what)?(int)what->QueryProp(P_GENDER):(int)what);
102
103 // Plural ist schoen einfach
104 if (QueryProp(P_PLURAL)) return "ihr"+query_g_suffix(gen2, casus, number);
105
106 return (((((int)QueryProp( P_GENDER ))==FEMALE )? "ihr":"sein")+
107 query_g_suffix(gen2%3, casus, number));
108}
109
110// Pronomen bestimmen nach KNG
111varargs string QueryPronoun(int casus)
112{
113 int gender;
114
115 // Plural ist immer einfach ...
116 if (QueryProp(P_PLURAL))
117 {
118 if (casus==WEM) return "ihnen";
119 return "sie";
120 }
121
122 switch(QueryProp(P_GENDER))
123 {
124 case FEMALE:
125 if (casus==WESSEN) return "ihrer";
126 if (casus==WEM) return "ihr";
127 return "sie";
128
129 case MALE:
130 if (casus==WER) return "er";
131 if (casus==WESSEN) return "seiner";
132 if (casus==WEM) return "ihm";
133 return "ihn";
134 }
135 if (casus==WESSEN) return "seiner";
136 if (casus==WEM) return "ihm";
137 return "es"; //fall-through
138}
139
140// Anrede fuer Spieler bestimmen
141varargs string QueryDu(int casus,int gender,int zahl)
142{
143 return
144 ({ ({({ "du", "ihr"}),({ "du", "ihr"}),({ "du", "ihr"})}),
145 ({({"deiner", "euer"}),({"deiner", "euer"}),({"deiner", "euer"})}),
146 ({({ "dir", "euch"}),({ "dir", "euch"}),({ "dir", "euch"})}),
147 ({({ "dich", "euch"}),({ "dich", "euch"}),({ "dich", "euch"})})
148 })[casus][gender][zahl];
149}
150
151// Welches Geschlecht hat das Objekt als String?
152string QueryGenderString()
153{
154 switch( (int)QueryProp( P_GENDER ))
155 {
156 case MALE: return "maennlich";
157 case FEMALE: return "weiblich";
158 }
159 return("saechlich"); //fall-through
160}
161
162// Artikel durchdeklinieren nach Kasus, Numerus, Genus und Art
163// des Artikels (demon==bestimmt)
164varargs string DeclAdj(mixed adj, int casus, int demon)
165{
166 // Unregelmaessige Adjektive
167 if( pointerp(adj) ) return adj[casus]+" ";
168
169 // Falscher Typ? Und Tschuess ...
170 if (!stringp(adj)) return "";
171
172 // Plural ist einfach
173 if (QueryProp(P_PLURAL))
174 {
175 // Bestimmt
176 if (demon) return adj+"en ";
177
178 // Unbestimmt
179 return adj + ({ "e ", "er ", "en ", "e " })[casus];
180 }
181
182 if ( demon )
183 return adj + ({ ({ "e " , "en ", "en ", "e " }),
184 ({ "e " , "en ", "en ", "en " }),
185 ({ "e " , "en ", "en ", "e " }) })
186 [(int)QueryProp( P_GENDER )][casus];
187 else
188 return adj + ({ ({ "es ", "en ", "en ", "es " }),
189 ({ "er ", "en ", "en ", "en " }),
190 ({ "e " , "en ", "en ", "e " }) })
191 [(int)QueryProp( P_GENDER )][casus];
192}
193
194// P_GENDER setzen. Es sind nur 0,1 und 2 (MALE,FEMALE,NEUTER) erlaubt
195static int _set_gender(int i)
196{
197 if (i>-1&&i<3) return Set(P_GENDER,i);
198 return Query(P_GENDER);
199}