#include "tools.h"
#include "files.h"
#include "network.h"
+#include "cartoons.h"
/* tape button identifiers */
#define TAPE_CTRL_ID_EJECT 0
-#define TAPE_CTRL_ID_STOP 1
-#define TAPE_CTRL_ID_PAUSE 2
-#define TAPE_CTRL_ID_RECORD 3
-#define TAPE_CTRL_ID_PLAY 4
+#define TAPE_CTRL_ID_INDEX 1
+#define TAPE_CTRL_ID_STOP 2
+#define TAPE_CTRL_ID_PAUSE 3
+#define TAPE_CTRL_ID_RECORD 4
+#define TAPE_CTRL_ID_PLAY 5
-#define NUM_TAPE_BUTTONS 5
+#define NUM_TAPE_BUTTONS 6
/* forward declaration for internal use */
static void HandleTapeButtons(struct GadgetInfo *);
tape.changed = TRUE;
tape.date = 10000*(zeit2->tm_year%100) + 100*zeit2->tm_mon + zeit2->tm_mday;
tape.random_seed = InitRND(NEW_RANDOMIZE);
+ tape.game_version = GAME_VERSION_ACTUAL;
for(i=0; i<MAX_PLAYERS; i++)
tape.player_participates[i] = FALSE;
DrawVideoDisplay(VIDEO_STATE_REC_ON, 0);
DrawVideoDisplay(VIDEO_STATE_DATE_ON, tape.date);
DrawVideoDisplay(VIDEO_STATE_TIME_ON, 0);
+ MapTapeIndexButton();
}
void TapeStopRecording()
{
- int i;
-
if (!tape.recording)
return;
- for(i=0; i<MAX_PLAYERS; i++)
- tape.pos[tape.counter].action[i] = 0;
-
tape.counter++;
tape.length = tape.counter;
tape.length_seconds = GetTapeLength();
tape.recording = FALSE;
tape.pausing = FALSE;
+
DrawVideoDisplay(VIDEO_STATE_REC_OFF, 0);
+ MapTapeEjectButton();
}
-void TapeRecordAction(byte joy[MAX_PLAYERS])
+void TapeRecordAction(byte action[MAX_PLAYERS])
{
int i;
return;
}
- for(i=0; i<MAX_PLAYERS; i++)
- tape.pos[tape.counter].action[i] = joy[i];
-
- tape.counter++;
- tape.pos[tape.counter].delay = 0;
-}
-
-void TapeRecordDelay()
-{
- int i;
+ if (tape.pos[tape.counter].delay > 0) /* already stored action */
+ {
+ boolean changed_events = FALSE;
- if (!tape.recording || tape.pausing)
- return;
+ for(i=0; i<MAX_PLAYERS; i++)
+ if (tape.pos[tape.counter].action[i] != action[i])
+ changed_events = TRUE;
- if (tape.counter >= MAX_TAPELEN)
- {
- TapeStopRecording();
- return;
+ if (changed_events || tape.pos[tape.counter].delay >= 255)
+ {
+ tape.counter++;
+ tape.pos[tape.counter].delay = 0;
+ }
+ else
+ tape.pos[tape.counter].delay++;
}
- tape.pos[tape.counter].delay++;
-
- if (tape.pos[tape.counter].delay >= 255)
+ if (tape.pos[tape.counter].delay == 0) /* store new action */
{
for(i=0; i<MAX_PLAYERS; i++)
- tape.pos[tape.counter].action[i] = 0;
+ tape.pos[tape.counter].action[i] = action[i];
- tape.counter++;
- tape.pos[tape.counter].delay = 0;
+ tape.pos[tape.counter].delay++;
}
}
state |= VIDEO_STATE_PBEND_OFF;
DrawVideoDisplay(state, 0);
+
+ if (tape.index_search)
+ {
+ SetDrawDeactivationMask(REDRAW_NONE);
+ RedrawPlayfield(TRUE, 0,0,0,0);
+ }
}
void TapeStartPlaying()
tape.playing = TRUE;
tape.pausing = FALSE;
tape.fast_forward = FALSE;
+ tape.index_search = FALSE;
+
InitRND(tape.random_seed);
DrawVideoDisplay(VIDEO_STATE_PLAY_ON, 0);
DrawVideoDisplay(VIDEO_STATE_DATE_ON, tape.date);
DrawVideoDisplay(VIDEO_STATE_TIME_ON, 0);
+ MapTapeIndexButton();
}
void TapeStopPlaying()
tape.playing = FALSE;
tape.pausing = FALSE;
+
DrawVideoDisplay(VIDEO_STATE_PLAY_OFF, 0);
+ MapTapeEjectButton();
}
byte *TapePlayAction()
{
- static byte joy[MAX_PLAYERS];
+ static byte action[MAX_PLAYERS];
int i;
if (!tape.playing || tape.pausing)
- return(NULL);
-
- if (tape.counter >= tape.length)
- {
- TapeStop();
- return(NULL);
- }
-
- if (tape.delay_played == tape.pos[tape.counter].delay)
- {
- tape.delay_played = 0;
- tape.counter++;
-
- for(i=0; i<MAX_PLAYERS; i++)
- joy[i] = tape.pos[tape.counter-1].action[i];
- }
- else
- {
- for(i=0; i<MAX_PLAYERS; i++)
- joy[i] = 0;
- }
-
- return(joy);
-}
-
-boolean TapePlayDelay()
-{
- if (!tape.playing || tape.pausing)
- return(FALSE);
+ return NULL;
if (tape.pause_before_death) /* STOP 10s BEFORE PLAYER GETS KILLED... */
{
if (TimePlayed > tape.length_seconds - TAPE_PAUSE_SECONDS_BEFORE_DEATH)
{
TapeTogglePause();
- return(FALSE);
+ return NULL;
+ }
+ }
+
+ if (tape.index_search)
+ {
+ if (tape.counter >= tape.length)
+ {
+ tape.index_search = FALSE;
+
+ SetDrawDeactivationMask(REDRAW_NONE);
+ RedrawPlayfield(TRUE, 0,0,0,0);
+
+ TapeTogglePause();
+ return NULL;
}
}
if (tape.counter >= tape.length)
{
TapeStop();
- return(TRUE);
+ return NULL;
}
- if (tape.delay_played < tape.pos[tape.counter].delay)
+ for(i=0; i<MAX_PLAYERS; i++)
+ action[i] = tape.pos[tape.counter].action[i];
+
+ tape.delay_played++;
+ if (tape.delay_played >= tape.pos[tape.counter].delay)
{
- tape.delay_played++;
- return(TRUE);
+ tape.counter++;
+ tape.delay_played = 0;
}
- else
- return(FALSE);
+
+ return action;
}
void TapeStop()
#define TAPE_BUTTON_YPOS 77
#define TAPE_BUTTON_EJECT_XPOS (TAPE_BUTTON_XPOS + 0 * TAPE_BUTTON_XSIZE)
+#define TAPE_BUTTON_INDEX_XPOS (TAPE_BUTTON_XPOS + 0 * TAPE_BUTTON_XSIZE)
#define TAPE_BUTTON_STOP_XPOS (TAPE_BUTTON_XPOS + 1 * TAPE_BUTTON_XSIZE)
#define TAPE_BUTTON_PAUSE_XPOS (TAPE_BUTTON_XPOS + 2 * TAPE_BUTTON_XSIZE)
#define TAPE_BUTTON_RECORD_XPOS (TAPE_BUTTON_XPOS + 3 * TAPE_BUTTON_XSIZE)
TAPE_CTRL_ID_EJECT,
"eject tape"
},
+ {
+ TAPE_BUTTON_INDEX_XPOS, TAPE_BUTTON_YPOS,
+ TAPE_CTRL_ID_INDEX,
+ "index mark"
+ },
{
TAPE_BUTTON_STOP_XPOS, TAPE_BUTTON_YPOS,
TAPE_CTRL_ID_STOP,
gd_x2 = DOOR_GFX_PAGEX3 + gd_xoffset;
gd_y = DOOR_GFX_PAGEY2 + gd_yoffset;
+ if (i == TAPE_CTRL_ID_INDEX)
+ {
+ gd_x1 = DOOR_GFX_PAGEX6 + gd_xoffset;
+ gd_x2 = DOOR_GFX_PAGEX5 + gd_xoffset;
+ }
+
gi = CreateGadget(GDI_CUSTOM_ID, id,
GDI_INFO_TEXT, tapebutton_info[i].infotext,
GDI_X, VX + gd_xoffset,
}
}
+void MapTapeEjectButton()
+{
+ UnmapGadget(tape_gadget[TAPE_CTRL_ID_INDEX]);
+ MapGadget(tape_gadget[TAPE_CTRL_ID_EJECT]);
+}
+
+void MapTapeIndexButton()
+{
+ UnmapGadget(tape_gadget[TAPE_CTRL_ID_EJECT]);
+ MapGadget(tape_gadget[TAPE_CTRL_ID_INDEX]);
+}
+
void MapTapeButtons()
{
int i;
for (i=0; i<NUM_TAPE_BUTTONS; i++)
- MapGadget(tape_gadget[i]);
+ if (i != TAPE_CTRL_ID_INDEX)
+ MapGadget(tape_gadget[i]);
+
+ if (tape.recording || tape.playing)
+ MapTapeIndexButton();
}
void UnmapTapeButtons()
DrawCompleteVideoDisplay();
break;
+ case TAPE_CTRL_ID_INDEX:
+ if (tape.recording)
+ printf("Setting index mark ...\n");
+ else if (tape.playing)
+ {
+ printf("Going to index mark ...\n");
+
+ tape.index_search = TRUE;
+ SetDrawDeactivationMask(REDRAW_FIELD);
+ }
+ break;
+
case TAPE_CTRL_ID_STOP:
TapeStop();
break;
#endif
{
game_status = PLAYING;
+ StopAnimation();
InitGame();
}
}
tape.playing = FALSE;
tape.recording = TRUE;
tape.changed = TRUE;
+ tape.game_version = GAME_VERSION_ACTUAL;
DrawVideoDisplay(VIDEO_STATE_PLAY_OFF | VIDEO_STATE_REC_ON,0);
}
TapeStartPlaying();
game_status = PLAYING;
+ StopAnimation();
InitGame();
}
else if (tape.playing)