+void DrawGlobalAnim(int drawing_stage)
+{
+ DrawGlobalAnimExt(drawing_stage);
+}
+
+boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part)
+{
+ int viewport_x;
+ int viewport_y;
+ int viewport_width;
+ int viewport_height;
+ boolean changed = FALSE;
+
+ if (part->last_anim_status == global.anim_status)
+ return FALSE;
+
+ part->last_anim_status = global.anim_status;
+
+ part->drawing_stage = DRAW_GLOBAL_ANIM_STAGE_1;
+
+ if (part->control_info.class == get_hash_from_key("window") ||
+ part->control_info.class == get_hash_from_key("border"))
+ {
+ viewport_x = 0;
+ viewport_y = 0;
+ viewport_width = WIN_XSIZE;
+ viewport_height = WIN_YSIZE;
+
+ part->drawing_stage = DRAW_GLOBAL_ANIM_STAGE_2;
+ }
+ else if (part->control_info.class == get_hash_from_key("door_1"))
+ {
+ viewport_x = DX;
+ viewport_y = DY;
+ viewport_width = DXSIZE;
+ viewport_height = DYSIZE;
+ }
+ else if (part->control_info.class == get_hash_from_key("door_2"))
+ {
+ viewport_x = VX;
+ viewport_y = VY;
+ viewport_width = VXSIZE;
+ viewport_height = VYSIZE;
+ }
+ else // default: "playfield"
+ {
+ viewport_x = REAL_SX;
+ viewport_y = REAL_SY;
+ viewport_width = FULL_SXSIZE;
+ viewport_height = FULL_SYSIZE;
+ }
+
+ if (viewport_x != part->viewport_x ||
+ viewport_y != part->viewport_y ||
+ viewport_width != part->viewport_width ||
+ viewport_height != part->viewport_height)
+ {
+ part->viewport_x = viewport_x;
+ part->viewport_y = viewport_y;
+ part->viewport_width = viewport_width;
+ part->viewport_height = viewport_height;
+
+ changed = TRUE;
+ }
+
+ return changed;
+}
+
+void PlayGlobalAnimSound(struct GlobalAnimPartControlInfo *part)
+{
+ int sound = part->sound;
+
+ if (sound == SND_UNDEFINED)
+ return;
+
+ if ((!setup.sound_simple && !IS_LOOP_SOUND(sound)) ||
+ (!setup.sound_loops && IS_LOOP_SOUND(sound)))
+ return;
+
+ // !!! TODO: ADD STEREO POSITION FOR MOVING ANIMATIONS !!!
+ if (IS_LOOP_SOUND(sound))
+ PlaySoundLoop(sound);
+ else
+ PlaySound(sound);
+
+#if 0
+ printf("::: PLAY %d.%d.%d: %d\n",
+ part->anim_nr, part->nr, part->mode_nr, sound);
+#endif
+}
+
+void StopGlobalAnimSound(struct GlobalAnimPartControlInfo *part)
+{
+ int sound = part->sound;
+
+ if (sound == SND_UNDEFINED)
+ return;
+
+ StopSound(sound);
+
+#if 0
+ printf("::: STOP %d.%d.%d: %d\n",
+ part->anim_nr, part->nr, part->mode_nr, sound);
+#endif
+}
+
+int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state)