blob: 9ec70afb144005af1c707b80dac26e9d9019ed12 [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 " }) })
Zesstra231c3aa2020-03-08 12:43:20 +010039 [({int})QueryProp(P_GENDER)][casus];
MG Mud User88f12472016-06-24 23:31:02 +020040}
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?
Zesstra6efb2ae2018-11-28 22:14:47 +010052protected varargs int SuggestArticle(string id)
MG Mud User88f12472016-06-24 23:31:02 +020053{
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) )
Zesstra231c3aa2020-03-08 12:43:20 +010064 if ( ob!=this_object()
65 && id == ({string})ob->Name(RAW) )
MG Mud User88f12472016-06-24 23:31:02 +020066 return 0;
67
68 // sonst bestimmt
69 return 1;
70}
71
72// Artikel bestimmen
Zesstra02e8b682018-11-28 22:28:15 +010073public varargs string QueryArticle(int casus, int dem, int force)
MG Mud User88f12472016-06-24 23:31:02 +020074{
75 // Kein Artikel
76 if (!force &&!(QueryProp(P_ARTICLE))) return "";
77
78 // Artikelart aussuchen
79 if ( dem==2 ) dem = SuggestArticle(QueryProp(P_NAME));
80
81 // Bestimmter Artikel
82 if (dem) return query_c_article(casus);
83
84 // Unbestimmter Artikel
85 if (QueryProp(P_PLURAL)) return "";
86
Zesstra231c3aa2020-03-08 12:43:20 +010087 return sprintf("ein%s ",query_g_suffix(({int})QueryProp(P_GENDER),casus));
MG Mud User88f12472016-06-24 23:31:02 +020088}
89
90// Besitzanzeiger fuer Objekt bestimmen
91varargs string QueryOwn(int casus)
92{
93 return sprintf("Dein%s",query_g_suffix(QueryProp(P_GENDER),casus));
94}
95
96// Possessivpronomen bestimmen
Zesstra231c3aa2020-03-08 12:43:20 +010097public varargs string QueryPossPronoun(int|object what, int casus, int number)
MG Mud User88f12472016-06-24 23:31:02 +020098{
99 int gen2;
100
101 // Geschlecht ermitteln
Zesstra231c3aa2020-03-08 12:43:20 +0100102 gen2 = (objectp(what)?({int})what->QueryProp(P_GENDER):what);
MG Mud User88f12472016-06-24 23:31:02 +0200103
104 // Plural ist schoen einfach
105 if (QueryProp(P_PLURAL)) return "ihr"+query_g_suffix(gen2, casus, number);
106
Zesstra231c3aa2020-03-08 12:43:20 +0100107 return ((((({int})QueryProp( P_GENDER ))==FEMALE )? "ihr":"sein")+
MG Mud User88f12472016-06-24 23:31:02 +0200108 query_g_suffix(gen2%3, casus, number));
109}
110
111// Pronomen bestimmen nach KNG
Zesstra02e8b682018-11-28 22:28:15 +0100112public varargs string QueryPronoun(int casus)
MG Mud User88f12472016-06-24 23:31:02 +0200113{
114 int gender;
115
116 // Plural ist immer einfach ...
117 if (QueryProp(P_PLURAL))
118 {
119 if (casus==WEM) return "ihnen";
120 return "sie";
121 }
122
123 switch(QueryProp(P_GENDER))
124 {
125 case FEMALE:
126 if (casus==WESSEN) return "ihrer";
127 if (casus==WEM) return "ihr";
128 return "sie";
129
130 case MALE:
131 if (casus==WER) return "er";
132 if (casus==WESSEN) return "seiner";
133 if (casus==WEM) return "ihm";
134 return "ihn";
135 }
136 if (casus==WESSEN) return "seiner";
137 if (casus==WEM) return "ihm";
138 return "es"; //fall-through
139}
140
141// Anrede fuer Spieler bestimmen
Zesstra02e8b682018-11-28 22:28:15 +0100142public varargs string QueryDu(int casus,int gender,int zahl)
MG Mud User88f12472016-06-24 23:31:02 +0200143{
144 return
145 ({ ({({ "du", "ihr"}),({ "du", "ihr"}),({ "du", "ihr"})}),
146 ({({"deiner", "euer"}),({"deiner", "euer"}),({"deiner", "euer"})}),
147 ({({ "dir", "euch"}),({ "dir", "euch"}),({ "dir", "euch"})}),
148 ({({ "dich", "euch"}),({ "dich", "euch"}),({ "dich", "euch"})})
149 })[casus][gender][zahl];
150}
151
152// Welches Geschlecht hat das Objekt als String?
Zesstra02e8b682018-11-28 22:28:15 +0100153public string QueryGenderString()
MG Mud User88f12472016-06-24 23:31:02 +0200154{
Zesstra231c3aa2020-03-08 12:43:20 +0100155 switch( ({int})QueryProp( P_GENDER ))
MG Mud User88f12472016-06-24 23:31:02 +0200156 {
157 case MALE: return "maennlich";
158 case FEMALE: return "weiblich";
159 }
160 return("saechlich"); //fall-through
161}
162
163// Artikel durchdeklinieren nach Kasus, Numerus, Genus und Art
164// des Artikels (demon==bestimmt)
Zesstra02e8b682018-11-28 22:28:15 +0100165public varargs string DeclAdj(string|string* adj, int casus, int demon)
MG Mud User88f12472016-06-24 23:31:02 +0200166{
167 // Unregelmaessige Adjektive
168 if( pointerp(adj) ) return adj[casus]+" ";
169
170 // Falscher Typ? Und Tschuess ...
171 if (!stringp(adj)) return "";
172
173 // Plural ist einfach
174 if (QueryProp(P_PLURAL))
175 {
176 // Bestimmt
177 if (demon) return adj+"en ";
178
179 // Unbestimmt
180 return adj + ({ "e ", "er ", "en ", "e " })[casus];
181 }
182
183 if ( demon )
184 return adj + ({ ({ "e " , "en ", "en ", "e " }),
185 ({ "e " , "en ", "en ", "en " }),
186 ({ "e " , "en ", "en ", "e " }) })
Zesstra231c3aa2020-03-08 12:43:20 +0100187 [({int})QueryProp( P_GENDER )][casus];
MG Mud User88f12472016-06-24 23:31:02 +0200188 else
189 return adj + ({ ({ "es ", "en ", "en ", "es " }),
190 ({ "er ", "en ", "en ", "en " }),
191 ({ "e " , "en ", "en ", "e " }) })
Zesstra231c3aa2020-03-08 12:43:20 +0100192 [({int})QueryProp( P_GENDER )][casus];
MG Mud User88f12472016-06-24 23:31:02 +0200193}
194
195// P_GENDER setzen. Es sind nur 0,1 und 2 (MALE,FEMALE,NEUTER) erlaubt
196static int _set_gender(int i)
197{
198 if (i>-1&&i<3) return Set(P_GENDER,i);
199 return Query(P_GENDER);
200}