+
+#ifndef MENUQC
+float Announcer_PickNumber(float type, float num)
+{
+ switch(type)
+ {
+ case CNT_GAMESTART:
+ {
+ switch(num)
+ {
+ case 10: return ANNCE_NUM_GAMESTART_10;
+ case 9: return ANNCE_NUM_GAMESTART_9;
+ case 8: return ANNCE_NUM_GAMESTART_8;
+ case 7: return ANNCE_NUM_GAMESTART_7;
+ case 6: return ANNCE_NUM_GAMESTART_6;
+ case 5: return ANNCE_NUM_GAMESTART_5;
+ case 4: return ANNCE_NUM_GAMESTART_4;
+ case 3: return ANNCE_NUM_GAMESTART_3;
+ case 2: return ANNCE_NUM_GAMESTART_2;
+ case 1: return ANNCE_NUM_GAMESTART_1;
+ }
+ break;
+ }
+ case CNT_IDLE:
+ {
+ switch(num)
+ {
+ case 10: return ANNCE_NUM_IDLE_10;
+ case 9: return ANNCE_NUM_IDLE_9;
+ case 8: return ANNCE_NUM_IDLE_8;
+ case 7: return ANNCE_NUM_IDLE_7;
+ case 6: return ANNCE_NUM_IDLE_6;
+ case 5: return ANNCE_NUM_IDLE_5;
+ case 4: return ANNCE_NUM_IDLE_4;
+ case 3: return ANNCE_NUM_IDLE_3;
+ case 2: return ANNCE_NUM_IDLE_2;
+ case 1: return ANNCE_NUM_IDLE_1;
+ }
+ break;
+ }
+ case CNT_KILL:
+ {
+ switch(num)
+ {
+ case 10: return ANNCE_NUM_KILL_10;
+ case 9: return ANNCE_NUM_KILL_9;
+ case 8: return ANNCE_NUM_KILL_8;
+ case 7: return ANNCE_NUM_KILL_7;
+ case 6: return ANNCE_NUM_KILL_6;
+ case 5: return ANNCE_NUM_KILL_5;
+ case 4: return ANNCE_NUM_KILL_4;
+ case 3: return ANNCE_NUM_KILL_3;
+ case 2: return ANNCE_NUM_KILL_2;
+ case 1: return ANNCE_NUM_KILL_1;
+ }
+ break;
+ }
+ case CNT_RESPAWN:
+ {
+ switch(num)
+ {
+ case 10: return ANNCE_NUM_RESPAWN_10;
+ case 9: return ANNCE_NUM_RESPAWN_9;
+ case 8: return ANNCE_NUM_RESPAWN_8;
+ case 7: return ANNCE_NUM_RESPAWN_7;
+ case 6: return ANNCE_NUM_RESPAWN_6;
+ case 5: return ANNCE_NUM_RESPAWN_5;
+ case 4: return ANNCE_NUM_RESPAWN_4;
+ case 3: return ANNCE_NUM_RESPAWN_3;
+ case 2: return ANNCE_NUM_RESPAWN_2;
+ case 1: return ANNCE_NUM_RESPAWN_1;
+ }
+ break;
+ }
+ case CNT_ROUNDSTART:
+ {
+ switch(num)
+ {
+ case 10: return ANNCE_NUM_ROUNDSTART_10;
+ case 9: return ANNCE_NUM_ROUNDSTART_9;
+ case 8: return ANNCE_NUM_ROUNDSTART_8;
+ case 7: return ANNCE_NUM_ROUNDSTART_7;
+ case 6: return ANNCE_NUM_ROUNDSTART_6;
+ case 5: return ANNCE_NUM_ROUNDSTART_5;
+ case 4: return ANNCE_NUM_ROUNDSTART_4;
+ case 3: return ANNCE_NUM_ROUNDSTART_3;
+ case 2: return ANNCE_NUM_ROUNDSTART_2;
+ case 1: return ANNCE_NUM_ROUNDSTART_1;
+ }
+ break;
+ }
+ default:
+ {
+ switch(num)
+ {
+ case 10: return ANNCE_NUM_10;
+ case 9: return ANNCE_NUM_9;
+ case 8: return ANNCE_NUM_8;
+ case 7: return ANNCE_NUM_7;
+ case 6: return ANNCE_NUM_6;
+ case 5: return ANNCE_NUM_5;
+ case 4: return ANNCE_NUM_4;
+ case 3: return ANNCE_NUM_3;
+ case 2: return ANNCE_NUM_2;
+ case 1: return ANNCE_NUM_1;
+ }
+ break;
+ }
+ }
+ return NOTIF_ABORT; // abort sending if none of these numbers were right
+}
+#endif
+
+#ifndef MENUQC
+float Mod_Q1BSP_SuperContentsFromNativeContents(float nativecontents)
+{
+ switch(nativecontents)
+ {
+ case CONTENT_EMPTY:
+ return 0;
+ case CONTENT_SOLID:
+ return DPCONTENTS_SOLID | DPCONTENTS_OPAQUE;
+ case CONTENT_WATER:
+ return DPCONTENTS_WATER;
+ case CONTENT_SLIME:
+ return DPCONTENTS_SLIME;
+ case CONTENT_LAVA:
+ return DPCONTENTS_LAVA | DPCONTENTS_NODROP;
+ case CONTENT_SKY:
+ return DPCONTENTS_SKY | DPCONTENTS_NODROP | DPCONTENTS_OPAQUE; // to match behaviour of Q3 maps, let sky count as opaque
+ }
+ return 0;
+}
+
+float Mod_Q1BSP_NativeContentsFromSuperContents(float supercontents)
+{
+ if(supercontents & (DPCONTENTS_SOLID | DPCONTENTS_BODY))
+ return CONTENT_SOLID;
+ if(supercontents & DPCONTENTS_SKY)
+ return CONTENT_SKY;
+ if(supercontents & DPCONTENTS_LAVA)
+ return CONTENT_LAVA;
+ if(supercontents & DPCONTENTS_SLIME)
+ return CONTENT_SLIME;
+ if(supercontents & DPCONTENTS_WATER)
+ return CONTENT_WATER;
+ return CONTENT_EMPTY;
+}
+#endif
+
+vector bezier_quadratic_getpoint(vector a, vector b, vector c, float t)
+{
+ return
+ (c - 2 * b + a) * (t * t) +
+ (b - a) * (2 * t) +
+ a;
+}
+
+vector bezier_quadratic_getderivative(vector a, vector b, vector c, float t)
+{
+ return
+ (c - 2 * b + a) * (2 * t) +
+ (b - a) * 2;
+}