blob: e0e3b3dd2b9e7f0625e726560a91bd084050b06b [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
MG Mud User88f12472016-06-24 23:31:02 +020011
12#include <thing/language.h>
13#include <thing/description.h>
14
15#define NEED_PROTOTYPES
16#include <thing/properties.h>
17
18// Kein create()
19void create()
20{
21 return;
22}
23
24//Inversion, damit Defaultwert von 0 einen Artikel ausgibt
25static int _query_article() { return !Query(P_ARTICLE); }
26
27static int _set_article(int art) { return !Set(P_ARTICLE,!art); }
28
29// Bestimmten Artikel bestimmen
30private string query_c_article(int casus)
31{
32 if (QueryProp(P_PLURAL))
33 return ({ "die ", "der ", "den ", "die "})[casus];
34
35 return ({ ({ "das ", "des ", "dem ", "das " }),
36 ({ "der ", "des ", "dem ", "den " }),
37 ({ "die ", "der ", "der ", "die " }) })
Zesstra231c3aa2020-03-08 12:43:20 +010038 [({int})QueryProp(P_GENDER)][casus];
MG Mud User88f12472016-06-24 23:31:02 +020039}
40
41// Ende fuer Artikel und Adjektive
42private varargs string query_g_suffix(int gen, int casus, int anzahl)
43{
44 return ({ ({ ({ "","e"}), ({"es","er"}), ({"em","en"}), ({ "","e"}) }),
45 ({ ({ "","e"}), ({"es","er"}), ({"em","en"}), ({"en","e"}) }),
46 ({ ({"e","e"}), ({"er","er"}), ({"er","en"}), ({ "e","e"}) }) })
47 [gen][casus][anzahl];
48}
49
50// Artikel vorschlagen: gibt es noch mehr Objekte im inv?
Zesstra6efb2ae2018-11-28 22:14:47 +010051protected varargs int SuggestArticle(string id)
MG Mud User88f12472016-06-24 23:31:02 +020052{
Arathornb3051452021-05-13 21:13:03 +020053 object ob;
MG Mud User88f12472016-06-24 23:31:02 +020054
55 // Raum oder Master: Bestimmt.
56 if (!environment()) return 1;
57
58 // Keine id? Dann raus
59 if (!id) return 1;
60
61 // Objekt mit gleichem Namen im env? Dann unbestimmt
62 for ( ob=first_inventory(environment()) ; ob ; ob=next_inventory(ob) )
Zesstra231c3aa2020-03-08 12:43:20 +010063 if ( ob!=this_object()
64 && id == ({string})ob->Name(RAW) )
MG Mud User88f12472016-06-24 23:31:02 +020065 return 0;
66
67 // sonst bestimmt
68 return 1;
69}
70
71// Artikel bestimmen
Zesstra02e8b682018-11-28 22:28:15 +010072public varargs string QueryArticle(int casus, int dem, int force)
MG Mud User88f12472016-06-24 23:31:02 +020073{
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
Zesstra231c3aa2020-03-08 12:43:20 +010086 return sprintf("ein%s ",query_g_suffix(({int})QueryProp(P_GENDER),casus));
MG Mud User88f12472016-06-24 23:31:02 +020087}
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
Zesstra231c3aa2020-03-08 12:43:20 +010096public varargs string QueryPossPronoun(int|object what, int casus, int number)
MG Mud User88f12472016-06-24 23:31:02 +020097{
98 int gen2;
99
100 // Geschlecht ermitteln
Zesstra231c3aa2020-03-08 12:43:20 +0100101 gen2 = (objectp(what)?({int})what->QueryProp(P_GENDER):what);
MG Mud User88f12472016-06-24 23:31:02 +0200102
103 // Plural ist schoen einfach
104 if (QueryProp(P_PLURAL)) return "ihr"+query_g_suffix(gen2, casus, number);
105
Zesstra231c3aa2020-03-08 12:43:20 +0100106 return ((((({int})QueryProp( P_GENDER ))==FEMALE )? "ihr":"sein")+
MG Mud User88f12472016-06-24 23:31:02 +0200107 query_g_suffix(gen2%3, casus, number));
108}
109
110// Pronomen bestimmen nach KNG
Zesstra02e8b682018-11-28 22:28:15 +0100111public varargs string QueryPronoun(int casus)
MG Mud User88f12472016-06-24 23:31:02 +0200112{
MG Mud User88f12472016-06-24 23:31:02 +0200113 // Plural ist immer einfach ...
114 if (QueryProp(P_PLURAL))
115 {
116 if (casus==WEM) return "ihnen";
117 return "sie";
118 }
119
120 switch(QueryProp(P_GENDER))
121 {
122 case FEMALE:
123 if (casus==WESSEN) return "ihrer";
124 if (casus==WEM) return "ihr";
125 return "sie";
126
127 case MALE:
128 if (casus==WER) return "er";
129 if (casus==WESSEN) return "seiner";
130 if (casus==WEM) return "ihm";
131 return "ihn";
132 }
133 if (casus==WESSEN) return "seiner";
134 if (casus==WEM) return "ihm";
135 return "es"; //fall-through
136}
137
138// Anrede fuer Spieler bestimmen
Zesstra02e8b682018-11-28 22:28:15 +0100139public varargs string QueryDu(int casus,int gender,int zahl)
MG Mud User88f12472016-06-24 23:31:02 +0200140{
141 return
142 ({ ({({ "du", "ihr"}),({ "du", "ihr"}),({ "du", "ihr"})}),
143 ({({"deiner", "euer"}),({"deiner", "euer"}),({"deiner", "euer"})}),
144 ({({ "dir", "euch"}),({ "dir", "euch"}),({ "dir", "euch"})}),
145 ({({ "dich", "euch"}),({ "dich", "euch"}),({ "dich", "euch"})})
146 })[casus][gender][zahl];
147}
148
149// Welches Geschlecht hat das Objekt als String?
Zesstra02e8b682018-11-28 22:28:15 +0100150public string QueryGenderString()
MG Mud User88f12472016-06-24 23:31:02 +0200151{
Zesstra231c3aa2020-03-08 12:43:20 +0100152 switch( ({int})QueryProp( P_GENDER ))
MG Mud User88f12472016-06-24 23:31:02 +0200153 {
154 case MALE: return "maennlich";
155 case FEMALE: return "weiblich";
156 }
157 return("saechlich"); //fall-through
158}
159
160// Artikel durchdeklinieren nach Kasus, Numerus, Genus und Art
161// des Artikels (demon==bestimmt)
Zesstra02e8b682018-11-28 22:28:15 +0100162public varargs string DeclAdj(string|string* adj, int casus, int demon)
MG Mud User88f12472016-06-24 23:31:02 +0200163{
164 // Unregelmaessige Adjektive
165 if( pointerp(adj) ) return adj[casus]+" ";
166
167 // Falscher Typ? Und Tschuess ...
168 if (!stringp(adj)) return "";
169
170 // Plural ist einfach
171 if (QueryProp(P_PLURAL))
172 {
173 // Bestimmt
174 if (demon) return adj+"en ";
175
176 // Unbestimmt
177 return adj + ({ "e ", "er ", "en ", "e " })[casus];
178 }
179
180 if ( demon )
181 return adj + ({ ({ "e " , "en ", "en ", "e " }),
182 ({ "e " , "en ", "en ", "en " }),
183 ({ "e " , "en ", "en ", "e " }) })
Zesstra231c3aa2020-03-08 12:43:20 +0100184 [({int})QueryProp( P_GENDER )][casus];
MG Mud User88f12472016-06-24 23:31:02 +0200185 else
186 return adj + ({ ({ "es ", "en ", "en ", "es " }),
187 ({ "er ", "en ", "en ", "en " }),
188 ({ "e " , "en ", "en ", "e " }) })
Zesstra231c3aa2020-03-08 12:43:20 +0100189 [({int})QueryProp( P_GENDER )][casus];
MG Mud User88f12472016-06-24 23:31:02 +0200190}
191
192// P_GENDER setzen. Es sind nur 0,1 und 2 (MALE,FEMALE,NEUTER) erlaubt
193static int _set_gender(int i)
194{
195 if (i>-1&&i<3) return Set(P_GENDER,i);
196 return Query(P_GENDER);
197}